Changeset - a3f649baa016
README.rst
Show inline comments
 
================
 
Kallithea README
 
================
 

	
 

	
 
About
 
-----
 

	
 
**Kallithea** is a fast and powerful management tool for Mercurial_ and Git_
 
with a built-in push/pull server, full text search and code-review. It works on
 
HTTP/HTTPS and SSH, has a built-in permission/authentication system with the ability
 
to authenticate via LDAP or ActiveDirectory. Kallithea also provides simple API
 
so it's easy to integrate with existing external systems.
 

	
 
Kallithea is similar in some respects to GitHub_ or Bitbucket_, however
 
Kallithea can be run as standalone hosted application on your own server. It is
 
open-source and focuses more on providing a customised,
 
self-administered interface for Mercurial_ and Git_ repositories. Kallithea
 
works on Unix-like systems and Windows.
 

	
 
Kallithea was forked from RhodeCode in July 2014 and has been heavily modified.
 

	
 

	
 
Installation
 
------------
 

	
 
Kallithea requires Python_ 3 and it is recommended to install it in a
 
virtualenv. Official releases of Kallithea can be installed with::
 

	
 
    pip install kallithea
 

	
 
The development repository is kept very stable and used in production by the
 
developers -- you can do the same.
 

	
 
Please visit https://docs.kallithea-scm.org/en/latest/installation.html for
 
more details.
 

	
 
There is also an experimental `Puppet module`_ for installing and setting up
 
Kallithea. Currently, only basic functionality is provided, but it is still
 
enough to get up and running quickly, especially for people without Python
 
background. See
 
https://docs.kallithea-scm.org/en/latest/installation_puppet.html for further
 
information.
 

	
 

	
 
Source code
 
-----------
 

	
 
The latest sources can be obtained from
 
https://kallithea-scm.org/repos/kallithea.
 

	
 

	
 
Kallithea features
 
------------------
 

	
 
- Has its own middleware to handle Mercurial_ and Git_ protocol requests. Each
 
  request is authenticated and logged together with IP address.
 
- Built for speed and performance. You can make multiple pulls/pushes
 
  simultaneously. Proven to work with thousands of repositories and users.
 
- Supports HTTP/HTTPS with LDAP, AD, or proxy-pass authentication.
 
- Supports SSH access with server-side public key management.
 
- Full permissions (private/read/write/admin) together with IP restrictions for
 
  each repository, additional explicit forking, repositories group and
 
  repository creation permissions.
 
- User groups for easier permission management.
 
- Repository groups let you group repos and manage them easier. They come with
 
  permission delegation features, so you can delegate groups management.
 
- Users can fork other users repos, and compare them at any time.
 
- Built-in versioned paste functionality (Gist) for sharing code snippets.
 
- Integrates easily with other systems, with custom created mappers you can
 
  connect it to almost any issue tracker, and with a JSON-RPC API you can make
 
  much more.
 
- Built-in commit API lets you add, edit and commit files right from Kallithea
 
  web interface using simple editor or upload binary files using simple form.
 
- Powerful pull request driven review system with inline commenting, changeset
 
  statuses, and notification system.
 
- Importing and syncing repositories from remote locations for Git_, Mercurial_
 
  and Subversion.
 
- Importing and syncing repositories from remote locations for Git_ and
 
  Mercurial_.
 
- Mako templates let you customize the look and feel of the application.
 
- Beautiful diffs, annotations and source code browsing all colored by
 
  pygments. Raw diffs are made in Git-diff format for both VCS systems,
 
  including Git_ binary-patches.
 
- Mercurial_ and Git_ DAG graphs and Flot-powered graphs with zooming and
 
  statistics to track activity for repositories.
 
- Admin interface with user/permission management. Admin activity journal logs
 
  pulls, pushes, forks, registrations and other actions made by all users.
 
- Server side forks. It is possible to fork a project and modify it freely
 
  without breaking the main repository.
 
- reST and Markdown README support for repositories.
 
- Full text search powered by Whoosh on the source files, commit messages, and
 
  file names. Built-in indexing daemons, with optional incremental index build
 
  (no external search servers required all in one application).
 
- Setup project descriptions/tags and info inside built in DB for easy,
 
  non-filesystem operations.
 
- Intelligent cache with invalidation after push or project change, provides
 
  high performance and always up to date data.
 
- RSS/Atom feeds, Gravatar support, downloadable sources as zip/tar/gz.
 
- Optional async tasks for speed and performance using Celery_.
 
- Backup scripts can do backup of whole app and send it over scp to desired
 
  location.
 
- Based on TurboGears2, SQLAlchemy, Whoosh, Bootstrap, and other open source
 
  libraries.
 
- Uses PostgreSQL, SQLite, or MariaDB/MySQL databases.
 

	
 

	
 
License
 
-------
 

	
 
**Kallithea** is released under the GPLv3 license. Kallithea is a `Software
 
Freedom Conservancy`_ project and thus controlled by a non-profit organization.
 
No commercial entity can take ownership of the project and change the
 
direction.
 

	
 
Kallithea started out as an effort to make sure the existing GPLv3 codebase
 
would stay available under a legal license. Kallithea thus has to stay GPLv3
 
compatible ... but we are also happy it is GPLv3 and happy to keep it that way.
 
A different license (such as AGPL) could perhaps help attract a different
 
community with a different mix of Free Software people and companies but we are
 
happy with the current focus.
 

	
 

	
 
Community
 
---------
 

	
 
**Kallithea** is maintained by its users who contribute the fixes they would
 
like to see.
 

	
 
Get in touch with the rest of the community:
 

	
 
- Join the mailing list users and developers -- see
 
  http://lists.sfconservancy.org/mailman/listinfo/kallithea-general.
 

	
 
- Use IRC and join #kallithea on FreeNode (irc.freenode.net) or use
 
  http://webchat.freenode.net/?channels=kallithea.
 

	
 
- Follow Kallithea on Twitter, **@KallitheaSCM**.
 

	
 
- Please report issues on the mailing list. An archive of the old issue tracker
 
  is available at: https://kallithea-scm.org/bitbucket-archive/issues/index.html
 

	
 
   .. note::
 

	
 
       Please try to read the documentation before posting any issues,
 
       especially the **troubleshooting section**
 

	
 

	
 
Online documentation
 
--------------------
 

	
 
Online documentation for the current version of Kallithea is available at
 
https://docs.kallithea-scm.org/en/stable/. Documentation for the current development
 
version can be found on https://docs.kallithea-scm.org/en/default/.
 

	
 
You can also build the documentation locally: go to ``docs/`` and run::
 

	
 
   make html
 

	
 
.. note:: You need to have Sphinx_ installed to build the
 
          documentation. If you don't have Sphinx_ installed you can
 
          install it via the command: ``pip install sphinx`` .
 

	
 

	
 
Migrating from RhodeCode
 
------------------------
 

	
 
Kallithea 0.3.2 and earlier supports migrating from an existing RhodeCode
 
installation. To migrate, install Kallithea 0.3.2 and follow the
 
instructions in the 0.3.2 README to perform a one-time conversion of the
 
database from RhodeCode to Kallithea, before upgrading to this version
 
of Kallithea.
 

	
 

	
 
.. _Python: http://www.python.org/
 
.. _Sphinx: http://sphinx.pocoo.org/
 
.. _Mercurial: http://mercurial.selenic.com/
 
.. _Bitbucket: http://bitbucket.org/
 
.. _GitHub: http://github.com/
 
.. _Subversion: http://subversion.tigris.org/
 
.. _Git: http://git-scm.com/
 
.. _Celery: http://celeryproject.org/
 
.. _Software Freedom Conservancy: http://sfconservancy.org/
 
.. _Puppet module: https://forge.puppetlabs.com/rauch/kallithea
docs/index.rst
Show inline comments
 
.. _index:
 

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

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

	
 

	
 
Readme
 
******
 

	
 
.. toctree::
 
   :maxdepth: 1
 

	
 
   readme
 

	
 

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

	
 
**Installation and upgrade**
 

	
 
.. toctree::
 
   :maxdepth: 1
 

	
 
   overview
 
   installation
 
   installation_win
 
   installation_win_old
 
   installation_iis
 
   installation_puppet
 
   upgrade
 

	
 
**Setup and configuration**
 

	
 
.. toctree::
 
   :maxdepth: 1
 

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

	
 
**Maintenance**
 

	
 
.. toctree::
 
   :maxdepth: 1
 

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

	
 

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

	
 
.. toctree::
 
   :maxdepth: 1
 

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

	
 

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

	
 
.. toctree::
 
   :maxdepth: 1
 

	
 
   contributing
 
   dev/i18n
 
   dev/dbmigrations
 

	
 

	
 
.. _python: http://www.python.org/
 
.. _django: http://www.djangoproject.com/
 
.. _mercurial: https://www.mercurial-scm.org/
 
.. _subversion: http://subversion.tigris.org/
 
.. _git: http://git-scm.com/
 
.. _celery: http://celeryproject.org/
 
.. _Sphinx: http://sphinx.pocoo.org/
 
.. _vcs: http://pypi.python.org/pypi/vcs
docs/usage/general.rst
Show inline comments
 
@@ -33,149 +33,141 @@ File view: follow current branch
 

	
 
In the file view, left and right arrows allow to jump to the previous and next
 
revision. Depending on the way revisions were created in the repository, this
 
could jump to a different branch.  When the checkbox ``Follow current branch``
 
is checked, these arrows will only jump to revisions on the same branch as the
 
currently visible revision.  So for example, if someone is viewing files in the
 
``beta`` branch and marks the `Follow current branch` checkbox, the < and >
 
arrows will only show revisions on the ``beta`` branch.
 

	
 

	
 
Changelog features
 
------------------
 

	
 
The core feature of a repository's ``changelog`` page is to show the revisions
 
in a repository. However, there are several other features available from the
 
changelog.
 

	
 
Branch filter
 
  By default, the changelog shows revisions from all branches in the
 
  repository. Use the branch filter to restrict to a given branch.
 

	
 
Viewing a changeset
 
  A particular changeset can be opened by clicking on either the changeset
 
  hash or the commit message, or by ticking the checkbox and clicking the
 
  ``Show selected changeset`` button at the top.
 

	
 
Viewing all changes between two changesets
 
  To get a list of all changesets between two selected changesets, along with
 
  the changes in each one of them, tick the checkboxes of the first and
 
  last changeset in the desired range and click the ``Show selected changesets``
 
  button at the top. You can only show the range between the first and last
 
  checkbox (no cherry-picking).
 

	
 
  From that page, you can proceed to viewing the overall delta between the
 
  selected changesets, by clicking the ``Compare revisions`` button.
 

	
 
Creating a pull request
 
  You can create a new pull request for the changes of a particular changeset
 
  (and its ancestors) by selecting it and clicking the ``Open new pull request
 
  for selected changesets`` button.
 

	
 

	
 
Permanent repository URLs
 
-------------------------
 

	
 
Due to the complicated nature of repository grouping, URLs of repositories
 
can often change. For example, a repository originally accessible from::
 

	
 
  http://kallithea.example.com/repo_name
 

	
 
would get a new URL after moving it to test_group::
 

	
 
  http://kallithea.example.com/test_group/repo_name
 

	
 
Such moving of a repository to a group can be an issue for build systems and
 
other scripts where the repository paths are hardcoded. To mitigate this,
 
Kallithea provides permanent URLs using the repository ID prefixed with an
 
underscore. In all Kallithea URLs, for example those for the changelog and the
 
file view, a repository name can be replaced by this ``_ID`` string. Since IDs
 
are always the same, moving the repository to a different group will not affect
 
such URLs.
 

	
 
In the example, the repository could also be accessible as::
 

	
 
  http://kallithea.example.com/_<ID>
 

	
 
The ID of a given repository can be shown from the repository ``Summary`` page,
 
by selecting the ``Show by ID`` button next to ``Clone URL``.
 

	
 

	
 
Email notifications
 
-------------------
 

	
 
With email settings properly configured in the Kallithea
 
configuration file, Kallithea will send emails on user registration and when
 
errors occur.
 

	
 
Emails are also sent for comments on changesets. In this case, an email is sent
 
to the committer of the changeset (if known to Kallithea), to all reviewers of
 
the pull request (if applicable) and to all people mentioned in the comment
 
using @mention notation.
 

	
 

	
 
Trending source files
 
---------------------
 

	
 
Trending source files are calculated based on a predefined dictionary of known
 
types and extensions. If an extension is missing or you would like to scan
 
custom files, it is possible to extend the ``LANGUAGES_EXTENSIONS_MAP``
 
dictionary located in ``kallithea/config/conf.py`` with new types.
 

	
 

	
 
Cloning remote repositories
 
---------------------------
 

	
 
Kallithea has the ability to clone repositories from given remote locations.
 
Currently it supports the following options:
 

	
 
- hg  -> hg clone
 
- svn -> hg clone
 
- git -> git clone
 

	
 
.. note:: svn -> hg cloning requires the ``hgsubversion`` library to be
 
   installed.
 

	
 
If you need to clone repositories that are protected via basic authentication,
 
you can pass the credentials in the URL, e.g.
 
``http://user:passw@remote.example.com/repo``. Kallithea will then try to login and
 
clone using the given credentials. Please note that the given credentials will
 
be stored as plaintext inside the database. However, the authentication
 
information will not be shown in the clone URL on the summary page.
 

	
 

	
 
Specific features configurable in the Admin settings
 
----------------------------------------------------
 

	
 
In general, the Admin settings should be self-explanatory and will not be
 
described in more detail in this documentation. However, there are a few
 
features that merit further explanation.
 

	
 
Repository extra fields
 
^^^^^^^^^^^^^^^^^^^^^^^
 

	
 
In the *Visual* tab, there is an option "Use repository extra
 
fields", which allows to set custom fields for each repository in the system.
 

	
 
Once enabled site-wide, the custom fields can be edited per-repository under
 
*Options* | *Settings* | *Extra Fields*.
 

	
 
Example usage of such fields would be to define company-specific information
 
into repositories, e.g., defining a ``repo_manager`` key that would give info
 
about a manager of each repository.  There's no limit for adding custom fields.
 
Newly created fields are accessible via the API.
 

	
 
Meta tagging
 
^^^^^^^^^^^^
 

	
 
In the *Visual* tab, option "Stylify recognised meta tags" will cause Kallithea
 
to turn certain text fragments in repository and repository group
 
descriptions into colored tags. Currently recognised tags are::
 

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

	
 
settings controller for Kallithea admin
 

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

	
 
import logging
 
import traceback
 

	
 
import formencode
 
from formencode import htmlfill
 
from tg import config, request
 
from tg import tmpl_context as c
 
from tg.i18n import ugettext as _
 
from webob.exc import HTTPFound
 

	
 
from kallithea.config.routing import url
 
from kallithea.lib import helpers as h
 
from kallithea.lib.auth import HasPermissionAnyDecorator, LoginRequired
 
from kallithea.lib.base import BaseController, render
 
from kallithea.lib.celerylib import tasks
 
from kallithea.lib.exceptions import HgsubversionImportError
 
from kallithea.lib.utils import repo2db_mapper, set_app_settings
 
from kallithea.lib.utils2 import safe_str
 
from kallithea.lib.vcs import VCSError
 
from kallithea.model.db import Repository, Setting, Ui
 
from kallithea.model.forms import ApplicationSettingsForm, ApplicationUiSettingsForm, ApplicationVisualisationForm
 
from kallithea.model.meta import Session
 
from kallithea.model.notification import EmailNotificationModel
 
from kallithea.model.scm import ScmModel
 

	
 

	
 
log = logging.getLogger(__name__)
 

	
 

	
 
class SettingsController(BaseController):
 
    """REST Controller styled on the Atom Publishing Protocol"""
 
    # To properly map this controller, ensure your config/routing.py
 
    # file has a resource setup:
 
    #     map.resource('setting', 'settings', controller='admin/settings',
 
    #         path_prefix='/admin', name_prefix='admin_')
 

	
 
    @LoginRequired(allow_default_user=True)
 
    def _before(self, *args, **kwargs):
 
        super(SettingsController, self)._before(*args, **kwargs)
 

	
 
    def _get_hg_ui_settings(self):
 
        ret = Ui.query().all()
 

	
 
        settings = {}
 
        for each in ret:
 
            k = each.ui_section + '_' + each.ui_key
 
            v = each.ui_value
 
            if k == 'paths_/':
 
                k = 'paths_root_path'
 

	
 
            k = k.replace('.', '_')
 

	
 
            if each.ui_section in ['hooks', 'extensions']:
 
                v = each.ui_active
 

	
 
            settings[k] = v
 
        return settings
 

	
 
    @HasPermissionAnyDecorator('hg.admin')
 
    def settings_vcs(self):
 
        c.active = 'vcs'
 
        if request.POST:
 
            application_form = ApplicationUiSettingsForm()()
 
            try:
 
                form_result = application_form.to_python(dict(request.POST))
 
            except formencode.Invalid as errors:
 
                return htmlfill.render(
 
                     render('admin/settings/settings.html'),
 
                     defaults=errors.value,
 
                     errors=errors.error_dict or {},
 
                     prefix_error=False,
 
                     encoding="UTF-8",
 
                     force_defaults=False)
 

	
 
            try:
 
                if c.visual.allow_repo_location_change:
 
                    sett = Ui.get_by_key('paths', '/')
 
                    sett.ui_value = form_result['paths_root_path']
 

	
 
                # HOOKS
 
                sett = Ui.get_by_key('hooks', Ui.HOOK_UPDATE)
 
                sett.ui_active = form_result['hooks_changegroup_update']
 

	
 
                sett = Ui.get_by_key('hooks', Ui.HOOK_REPO_SIZE)
 
                sett.ui_active = form_result['hooks_changegroup_repo_size']
 

	
 
                ## EXTENSIONS
 
                sett = Ui.get_or_create('extensions', 'largefiles')
 
                sett.ui_active = form_result['extensions_largefiles']
 

	
 
                sett = Ui.get_or_create('extensions', 'hgsubversion')
 
                sett.ui_active = form_result['extensions_hgsubversion']
 
                if sett.ui_active:
 
                    try:
 
                        import hgsubversion  # pragma: no cover
 
                        assert hgsubversion
 
                    except ImportError:
 
                        raise HgsubversionImportError
 

	
 
#                sett = Ui.get_or_create('extensions', 'hggit')
 
#                sett.ui_active = form_result['extensions_hggit']
 

	
 
                Session().commit()
 

	
 
                h.flash(_('Updated VCS settings'), category='success')
 

	
 
            except HgsubversionImportError:
 
                log.error(traceback.format_exc())
 
                h.flash(_('Unable to activate hgsubversion support. '
 
                          'The "hgsubversion" library is missing'),
 
                        category='error')
 

	
 
            except Exception:
 
                log.error(traceback.format_exc())
 
                h.flash(_('Error occurred while updating '
 
                          'application settings'), category='error')
 

	
 
        defaults = Setting.get_app_settings()
 
        defaults.update(self._get_hg_ui_settings())
 

	
 
        return htmlfill.render(
 
            render('admin/settings/settings.html'),
 
            defaults=defaults,
 
            encoding="UTF-8",
 
            force_defaults=False)
 

	
 
    @HasPermissionAnyDecorator('hg.admin')
 
    def settings_mapping(self):
 
        c.active = 'mapping'
 
        if request.POST:
 
            rm_obsolete = request.POST.get('destroy', False)
 
            install_git_hooks = request.POST.get('hooks', False)
 
            overwrite_git_hooks = request.POST.get('hooks_overwrite', False)
 
            invalidate_cache = request.POST.get('invalidate', False)
 
            log.debug('rescanning repo location with destroy obsolete=%s, '
 
                      'install git hooks=%s and '
 
                      'overwrite git hooks=%s' % (rm_obsolete, install_git_hooks, overwrite_git_hooks))
 

	
 
            filesystem_repos = ScmModel().repo_scan()
 
            added, removed = repo2db_mapper(filesystem_repos, rm_obsolete,
 
                                            install_git_hooks=install_git_hooks,
 
                                            user=request.authuser.username,
 
                                            overwrite_git_hooks=overwrite_git_hooks)
 
            added_msg = h.HTML(', ').join(
 
                h.link_to(safe_str(repo_name), h.url('summary_home', repo_name=repo_name)) for repo_name in added
 
            ) or '-'
 
            removed_msg = h.HTML(', ').join(
 
                safe_str(repo_name) for repo_name in removed
 
            ) or '-'
 
            h.flash(h.HTML(_('Repositories successfully rescanned. Added: %s. Removed: %s.')) %
 
                    (added_msg, removed_msg), category='success')
 

	
 
            if invalidate_cache:
 
                log.debug('invalidating all repositories cache')
 
                i = 0
 
                for repo in Repository.query():
 
                    try:
 
                        ScmModel().mark_for_invalidation(repo.repo_name)
 
                        i += 1
 
                    except VCSError as e:
 
                        log.warning('VCS error invalidating %s: %s', repo.repo_name, e)
 
                h.flash(_('Invalidated %s repositories') % i, category='success')
 

	
 
            raise HTTPFound(location=url('admin_settings_mapping'))
 

	
 
        defaults = Setting.get_app_settings()
 
        defaults.update(self._get_hg_ui_settings())
 

	
 
        return htmlfill.render(
 
            render('admin/settings/settings.html'),
 
            defaults=defaults,
 
            encoding="UTF-8",
 
            force_defaults=False)
 

	
 
    @HasPermissionAnyDecorator('hg.admin')
 
    def settings_global(self):
 
        c.active = 'global'
 
        if request.POST:
 
            application_form = ApplicationSettingsForm()()
 
            try:
 
                form_result = application_form.to_python(dict(request.POST))
 
            except formencode.Invalid as errors:
 
                return htmlfill.render(
 
                    render('admin/settings/settings.html'),
 
                    defaults=errors.value,
 
                    errors=errors.error_dict or {},
 
                    prefix_error=False,
 
                    encoding="UTF-8",
 
                    force_defaults=False)
 

	
 
            try:
 
                for setting in (
 
                    'title',
 
                    'realm',
 
                    'ga_code',
 
                    'captcha_public_key',
 
                    'captcha_private_key',
 
                ):
 
                    Setting.create_or_update(setting, form_result[setting])
 

	
 
                Session().commit()
 
                set_app_settings(config)
 
                h.flash(_('Updated application settings'), category='success')
 

	
 
            except Exception:
 
                log.error(traceback.format_exc())
 
                h.flash(_('Error occurred while updating '
 
                          'application settings'),
kallithea/i18n/be/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -369,199 +369,192 @@ msgstr "Створаная новая група рэпазітароў %s"
 
msgid "Updated repository group %s"
 
msgstr "Група рэпазітароў %s абноўленая"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "An error occurred during deletion of user"
 
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 %s з белага спісу карыстальніка"
 

	
 
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 "Старонка даступная толькі аўтарызаваным карыстальнікам"
 
@@ -851,199 +844,192 @@ 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 "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 "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 рэпазітара. Ён мусіць быць карэктным URL http, https, ssh, "
 
"svn+http ці svn+https"
 

	
 
msgid "Fork has to be the same type as parent"
 
msgstr "Тып форка будзе супадаць з бацькоўскім"
 

	
 
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 "Гэты e-mail ужо ўжываецца"
 

	
 
msgid "Email address \"%(email)s\" not found"
 
msgstr "Email-адрас \"%(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 павінна быць паказана значэнне атрыбута 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 ""
 
"Значэнне маскі падсеткі павінна быць у межах ад 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 "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 "Forgot your password ?"
 
msgstr "Забыліся на пароль?"
 

	
 
msgid "Don't have an account ?"
 
msgstr "Няма акаўнта?"
 
@@ -1582,195 +1568,192 @@ msgid "Repository URL"
 
msgstr "URL рэпазітара"
 

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

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

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

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

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

	
 
msgid "State"
 
msgstr "Стан"
 

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

	
 
msgid "Hooks"
 
msgstr "Хукі"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "Last Login"
kallithea/i18n/da/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -402,199 +402,192 @@ msgstr "Der opstod en fejl under opdater
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "Nothing"
 
msgstr "Intet"
 

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

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

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

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

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

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

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

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

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

	
 
msgid "Updated application settings"
 
msgstr "Opdateret applikationsindstillinger"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "Opdateret visualiseringsindstillinger"
 

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

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

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

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

	
 
msgid "Updated hooks"
 
msgstr "Opdateret hooks"
 

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

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

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

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

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

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

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

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

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

	
 
msgid "Updated permissions"
 
msgstr "Tilladelser opdateret"
 

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

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

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

	
 
msgid "User updated successfully"
 
msgstr "Bruger opdateret"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Slettet bruger"
 

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

	
 
msgid "The default user cannot be edited"
 
msgstr "Standardbrugeren kan ikke redigeres"
 

	
 
msgid "Added IP address %s to user whitelist"
 
msgstr "Tilføjet IP-adresse %s til bruger-whitelist"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Der opstod en fejl under tilføjelse af IP-adresse"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "Fjernet IP-adresse fra bruger-whitelist"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr "Du skal være registreret bruger for at kunne udføre denne handling"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Du skal være logget ind for at se denne side"
 

	
kallithea/i18n/de/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -393,199 +393,192 @@ msgid "This group contains %s repositori
 
msgstr "Die Gruppe enthält %s Repositorys und kann nicht gelöscht werden"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "Repository permissions updated"
 
msgstr "Repositoriumsberechtigungen aktualisiert"
 

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

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

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

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

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

	
 
msgid "Nothing"
 
msgstr "Nichts"
 

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

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

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

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

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

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

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

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

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

	
 
msgid "Updated application settings"
 
msgstr "Anwendungseinstellungen aktualisiert"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "Visualisierungseinstellungen aktualisiert"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "Updated permissions"
 
msgstr "Berechtigungen wurden aktualisiert"
 

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

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

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

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

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

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

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

	
 
msgid "Added IP address %s to user whitelist"
 
@@ -928,199 +921,192 @@ msgstr "Letzter Tip"
 

	
 
msgid "New user registration"
 
msgstr "Neue Benutzerregistrierung"
 

	
 
msgid ""
 
"User \"%s\" still owns %s repositories and cannot be removed. Switch "
 
"owners or remove those repositories: %s"
 
msgstr ""
 
"Der Benutzer \"%s\" besitzt noch immer %s Repositories und kann daher "
 
"nicht entfernt werden. Entweder muss der Besitzer geändert oder das "
 
"Repository entfernt werden: %s"
 

	
 
msgid ""
 
"User \"%s\" still owns %s repository groups and cannot be removed. Switch "
 
"owners or remove those repository groups: %s"
 
msgstr ""
 
"Der Benutzer \"%s\" ist noch der Besitzer von %s Repositorygruppen und "
 
"kann daher nicht entfernt werden. Entweder muss der Besitzer geändert "
 
"oder die Repositorygruppen müssen entfernt werden: %s"
 

	
 
msgid ""
 
"User \"%s\" still owns %s user groups and cannot be removed. Switch "
 
"owners or remove those user groups: %s"
 
msgstr ""
 
"Der Benutzer \"%s\" besitzt noch immer %s Benutzergruppen und kann daher "
 
"nicht entfernt werden. Entweder muss der Besitzer geändert oder die "
 
"Benutzergruppen müssen gelöscht werden: %s"
 

	
 
msgid "Password reset link"
 
msgstr "Link zum Zurücksetzen des Passworts"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "About"
 
msgstr "Über"
 

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

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

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

	
 
msgid "Edit Repository Group"
 
msgstr "Repositorygruppe bearbeiten"
 

	
 
msgid "Repository"
 
msgstr "Repository"
 

	
 
msgid "Description"
 
msgstr "Beschreibung"
 

	
 
msgid "Last Change"
 
msgstr "Letzte Änderung"
 

	
 
msgid "Tip"
 
msgstr "Tipp"
 

	
 
msgid "Owner"
 
msgstr "Besitzer"
 

	
 
msgid "Log In"
 
msgstr "Log In"
 

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

	
 
msgid "Username"
 
msgstr "Benutzername"
 

	
 
msgid "Password"
 
@@ -2010,203 +1996,192 @@ msgstr "Datensätze fehlender Repositories löschen"
 

	
 
msgid ""
 
"Check this option to remove all comments, pull requests and other records "
 
"related to repositories that no longer exist in the filesystem."
 
msgstr ""
 
"Aktivieren Sie diese Option, um alle Kommentare, Pull-Requests und andere "
 
"Datensätze zu entfernen, die sich auf Repositories beziehen, die nicht "
 
"mehr im Dateisystem vorhanden sind."
 

	
 
msgid "Invalidate cache for all repositories"
 
msgstr "Cache für alle Repositories entwerten"
 

	
 
msgid "Check this to reload data and clear cache keys for all repositories."
 
msgstr ""
 
"Aktivieren Sie dies, um Daten neu zu laden und Cache-Schlüssel für alle "
 
"Repositories zu löschen."
 

	
 
msgid "Install Git hooks"
 
msgstr "Git-Hooks installieren"
 

	
 
msgid ""
 
"Verify if Kallithea's Git hooks are installed for each repository. "
 
"Current hooks will be updated to the latest version."
 
msgstr ""
 
"Überprüfen Sie, ob die Git-Hooks von Kallithea für jedes Repository "
 
"installiert sind. Aktuelle Hooks werden auf die neueste Version "
 
"aktualisiert."
 

	
 
msgid "Overwrite existing Git hooks"
 
msgstr "Bestehende Git-Hooks überschreiben"
 

	
 
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 ""
 
"Wenn Sie Git-Hooks installieren, überschreiben Sie alle vorhandenen "
 
"Hooks, auch wenn sie nicht von Kallithea zu kommen scheinen. WARNUNG: "
 
"Diese Operation zerstört alle benutzerdefinierten Git-Hooks, die Sie "
 
"möglicherweise von Hand bereitgestellt haben!"
 

	
 
msgid "Rescan Repositories"
 
msgstr "Repositories erneut scannen"
 

	
 
msgid "Index build option"
 
msgstr "Option zum Aufbau eines Index"
 

	
 
msgid "Build from scratch"
 
msgstr "Von Grund auf neu bauen"
 

	
 
msgid ""
 
"This option completely reindexeses all of the repositories for proper "
 
"fulltext search capabilities."
 
msgstr ""
 
"Diese Option führt zu einer vollständigen Neuindizierung aller "
 
"Repositories für eine korrekte Volltextsuche."
 

	
 
msgid "Reindex"
 
msgstr "Erneut Indizieren"
 

	
 
msgid "Checking for updates..."
 
msgstr "Prüfe auf Updates..."
 

	
 
msgid "Kallithea version"
 
msgstr "Kallithea-Version"
 

	
 
msgid "Kallithea configuration file"
 
msgstr "Kallithea Konfigurationsdatei"
 

	
 
msgid "Python version"
 
msgstr "Python-Version"
 

	
 
msgid "Platform"
 
msgstr "Plattform"
 

	
 
msgid "Git version"
 
msgstr "Git-Version"
 

	
 
msgid "Git path"
 
msgstr "Git-Pfad"
 

	
 
msgid "Python Packages"
 
msgstr "Python-Pakete"
 

	
 
msgid "Show repository size after push"
 
msgstr "Zeigt die Größe des Repositories nach dem Push an"
 

	
 
msgid "Update repository after push (hg update)"
 
msgstr "Repository nach dem Push aktualisieren (hg update)"
 

	
 
msgid "Mercurial extensions"
 
msgstr "Mercurial-Erweiterungen"
 

	
 
msgid "Enable largefiles extension"
 
msgstr "Erweiterung largefiles aktivieren"
 

	
 
msgid "Enable hgsubversion extension"
 
msgstr "Erweiterung hgsubversion aktivieren"
 

	
 
msgid ""
 
"Requires hgsubversion library to be installed. Enables cloning of remote "
 
"Subversion repositories while converting them to Mercurial."
 
msgstr ""
 
"Erfordert die Installation der hgsubversion-Bibliothek. Ermöglicht das "
 
"Klonen von entfernten Subversion-Repositories während der Konvertierung "
 
"zu Mercurial."
 

	
 
msgid "Location of repositories"
 
msgstr "Ort der Repositories"
 

	
 
msgid ""
 
"Click to unlock. You must restart Kallithea in order to make this setting "
 
"take effect."
 
msgstr ""
 
"Zum Entsperren klicken. Sie müssen Kallithea neu starten, damit diese "
 
"Einstellung wirksam wird."
 

	
 
msgid ""
 
"Filesystem location where repositories are stored. After changing this "
 
"value, a restart and rescan of the repository folder are both required."
 
msgstr ""
 
"Dateisystem-Speicherort, an dem die Repositories gespeichert sind. Nach "
 
"dem Ändern dieses Wertes sind sowohl ein Neustart als auch ein erneuter "
 
"Scan des Repository-Ordners erforderlich."
 

	
 
msgid "General"
 
msgstr "Allgemein"
 

	
 
msgid "Use repository extra fields"
 
msgstr "Zusätzliche Repository-Felder verwenden"
 

	
 
msgid "Allows storing additional customized fields per repository."
 
msgstr ""
 
"Ermöglicht die Speicherung zusätzlicher benutzerdefinierter Felder pro "
 
"Repository."
 

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

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

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

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

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

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

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

	
 
msgid "Icons"
 
msgstr "Icons"
 

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

	
 
msgid "Show private repository icon on repositories"
 
msgstr "Privates Repository-Symbol in Repositories anzeigen"
kallithea/i18n/el/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -447,199 +447,192 @@ msgstr "Αυτή η ομάδα περιέχει %s αποθετήρια και δε μπορεί να διαγραφεί"
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Αυτή η ομάδα περιέχει %s υποομάδες και δε μπορεί να διαγραφεί"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Αφαιρέθηκε η ομάδα αποθετηρίου %s"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "Παρουσιάστηκε σφάλμα κατά τη διαγραφή της ομάδας αποθετηρίων %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Δεν μπορείτε να ανακαλέσετε την άδεια σας ως διαχειριστής"
 

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

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την ανάκληση του δικαιώματος"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Σφάλμα κατά τη δημιουργία αποθετηρίου %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Δημιουργήθηκε το αποθετήριο %s από το %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Κλωνοποιήθηκε το αποθετηρίο %s ως %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Δημιουργήθηκε το αποθετήριο %s"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Το αποθετήριο %s ενημερώθηκε επιτυχώς"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την ενημέρωση του αποθετηρίου %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "Αποσυνδέθηκαν %s κλώνοι"
 

	
 
msgid "Deleted %s forks"
 
msgstr "Διαγράφηκαν %s κλώνοι"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Διαγράφηκε το αποθετήριο %s"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Δε μπορεί να διαγραφεί το αποθετήριο %s που ακόμα έχει κλώνους"
 

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

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

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

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

	
 
msgid "An error occurred during removal of field"
 
msgstr "Παρουσιάστηκε σφάλμα κατά την απομάκρυνση του πεδίου"
 

	
 
msgid "-- Not a fork --"
 
msgstr "-- Όχι κλώνος --"
 

	
 
msgid "Updated repository visibility in public journal"
 
msgstr "Ενημερώθηκε η ορατότητα του αποθετηρίου στο δημόσιο ημερολόγιο"
 

	
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr ""
 
"Παρουσιάστηκε σφάλμα κατά την τοποθέτηση αυτού το αποθετηρίου στο δημόσιο "
 
"ημερολόγιο"
 

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

	
 
msgid "Marked repository %s as fork of %s"
 
msgstr "Σημειώθηκε το αποθετήριο %s σαν κλώνος του %s"
 

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

	
 
msgid "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 προστέθηκε στην λίστα επιτρεπόμενων του χρήστη"
 

	
 
@@ -1038,199 +1031,192 @@ msgstr ""
 
"ομάδες: %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 ""
 
@@ -2167,203 +2153,192 @@ msgid "Delete records of missing reposit
 
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"
kallithea/i18n/fr/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -456,199 +456,192 @@ msgid "This group contains %s subgroups 
 
msgstr "Ce groupe contient %s sous-groupes et ne peut pas être supprimé"
 

	
 
msgid "Removed repository group %s"
 
msgstr "Groupe de dépôts %s supprimé"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr ""
 
"Une erreur est survenue durant la suppression du groupe de dépôts %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Impossible de révoquer votre permission d'administrateur"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Permissions du groupe de dépôts mises à jour"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Une erreur est survenue durant la révocation de la permission"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Erreur de création du dépôt %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Dépôt %s créé depuis %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "dépôt %s forké en tant que %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Dépôt %s créé"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Dépôt %s mis à jour avec succès"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Une erreur est survenue durant la mise à jour du dépôt %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "%s forks détachés"
 

	
 
msgid "Deleted %s forks"
 
msgstr "%s forks supprimés"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Dépôt %s supprimé"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Impossible de supprimer le dépôt %s : des forks y sont attachés"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Erreur pendant la suppression de %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Permissions du dépôt mises à jour"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Erreur de validation du champ : %s"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Une erreur est survenue durant la création du champ : %r"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "Une erreur est survenue durant la suppression du champ"
 

	
 
msgid "-- Not a fork --"
 
msgstr "-- Pas un fork --"
 

	
 
msgid "Updated repository visibility in public journal"
 
msgstr "La visibilité du dépôt dans le journal public a été mise à jour"
 

	
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr ""
 
"Une erreur est survenue durant la configuration du journal public pour ce "
 
"dépôt"
 

	
 
msgid "Nothing"
 
msgstr "[Aucun dépôt]"
 

	
 
msgid "Marked repository %s as fork of %s"
 
msgstr "Le dépôt %s a été marké comme fork de %s"
 

	
 
msgid "An error occurred during this operation"
 
msgstr "Une erreur est survenue durant cette opération"
 

	
 
msgid "Pulled from remote location"
 
msgstr "Les changements distants ont été récupérés"
 

	
 
msgid "An error occurred during pull from remote location"
 
msgstr "Une erreur est survenue durant le pull depuis la source distante"
 

	
 
msgid "An error occurred during deletion of repository stats"
 
msgstr ""
 
"Une erreur est survenue durant la suppression des statistiques du dépôt"
 

	
 
msgid "Updated VCS settings"
 
msgstr "Réglages des gestionnaires de versions mis à jour"
 

	
 
msgid ""
 
"Unable to activate hgsubversion support. The \"hgsubversion\" library is "
 
"missing"
 
msgstr ""
 
"Impossible d'activer la prise en charge de hgsubversion. La bibliothèque "
 
"« hgsubversion » est manquante"
 

	
 
msgid "Error occurred while updating application settings"
 
msgstr ""
 
"Une erreur est survenue durant la mise à jour des réglages de "
 
"l'application"
 

	
 
msgid "Repositories successfully rescanned. Added: %s. Removed: %s."
 
msgstr "Dépôts ré-analysés avec succès. Ajouté : %s. Supprimé : %s."
 

	
 
msgid "Invalidated %s repositories"
 
msgstr "%s dépôts invalidés"
 

	
 
msgid "Updated application settings"
 
msgstr "Réglages mis à jour"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "Réglages d’affichage mis à jour"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr ""
 
"Une erreur est survenue durant la mise à jour des réglages de "
 
"visualisation"
 

	
 
msgid "Please enter email address"
 
msgstr "Veuillez entrer votre adresse e-mail"
 

	
 
msgid "Send email task created"
 
msgstr "Tâche d'envoi d'e-mail créée"
 

	
 
msgid "Hook already exists"
 
msgstr "Le hook existe déjà"
 

	
 
msgid "Builtin hooks are read-only. Please use another hook name."
 
msgstr ""
 
"Les hooks intégrés sont en lecture seule. Merci de choisir un autre nom "
 
"pour le hook."
 

	
 
msgid "Added new hook"
 
msgstr "Le nouveau hook a été ajouté"
 

	
 
msgid "Updated hooks"
 
msgstr "Hooks mis à jour"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Une erreur est survenue durant la création du hook"
 

	
 
msgid "Whoosh reindex task scheduled"
 
msgstr "La tâche de réindexation Whoosh a été planifiée"
 

	
 
msgid "Created user group %s"
 
msgstr "Groupe d'utilisateurs %s créé"
 

	
 
msgid "Error occurred during creation of user group %s"
 
msgstr ""
 
"Une erreur est survenue durant la création du groupe d'utilisateurs %s"
 

	
 
msgid "Updated user group %s"
 
msgstr "Groupe d'utilisateurs %s mis à jour"
 

	
 
msgid "Error occurred during update of user group %s"
 
msgstr ""
 
"Une erreur est survenue durant la mise à jour du groupe d'utilisateurs %s"
 

	
 
msgid "Successfully deleted user group"
 
msgstr "Groupe d'utilisateurs supprimé avec succès"
 

	
 
msgid "An error occurred during deletion of user group"
 
msgstr ""
 
"Une erreur est survenue durant la suppression du groupe d'utilisateurs"
 

	
 
msgid "Target group cannot be the same"
 
msgstr "Le groupe cible ne peut pas être le même"
 

	
 
msgid "User group permissions updated"
 
msgstr "Permissions du groupe d'utilisateurs mises à jour"
 

	
 
msgid "Updated permissions"
 
msgstr "Permissions mises à jour"
 

	
 
msgid "An error occurred during permissions saving"
 
msgstr "Une erreur est survenue durant l’enregistrement des permissions"
 

	
 
msgid "Created user %s"
 
msgstr "Utilisateur %s créé"
 

	
 
msgid "Error occurred during creation of user %s"
 
msgstr "Une erreur est survenue durant la création de l'utilisateur %s"
 

	
 
msgid "User updated successfully"
 
msgstr "L’utilisateur a été mis à jour avec succès"
 

	
 
msgid "Successfully deleted user"
 
msgstr "Utilisateur supprimé avec succès"
 

	
 
msgid "An error occurred during deletion of user"
 
msgstr "Une erreur est survenue durant la suppression de l’utilisateur"
 

	
 
@@ -1134,199 +1127,192 @@ msgstr ""
 
"supprimé. Changez les propriétaires ou supprimez ces dépôts : %s"
 

	
 
msgid ""
 
"User \"%s\" still owns %s user groups and cannot be removed. Switch "
 
"owners or remove those user groups: %s"
 
msgstr ""
 
"L’utilisateur « %s » possède %s groupes d'utilisateurs et ne peut pas "
 
"être supprimé. Changez les propriétaires de ces groupes d'utilisateurs ou "
 
"supprimez-les : %s"
 

	
 
msgid "Password reset link"
 
msgstr "Lien de remise à zéro du mot de passe"
 

	
 
msgid "Password reset notification"
 
msgstr "Notification de réinitialisation du mot de passe"
 

	
 
msgid ""
 
"The password to your account %s has been changed using password reset "
 
"form."
 
msgstr ""
 
"Le mot de passe de votre compte %s a été changé via le formulaire de "
 
"réinitialisation du mot de passe."
 

	
 
msgid "Value cannot be an empty list"
 
msgstr "Cette valeur ne peut être une liste vide"
 

	
 
msgid "Username \"%(username)s\" already exists"
 
msgstr "Le nom d’utilisateur « %(username)s » existe déjà"
 

	
 
msgid "Username \"%(username)s\" cannot be used"
 
msgstr "Le nom d’utilisateur « %(username)s » n’est pas valide"
 

	
 
msgid ""
 
"Username may only contain alphanumeric characters underscores, periods or "
 
"dashes and must begin with an alphanumeric character or underscore"
 
msgstr ""
 
"Le nom d'utilisateur ne peut contenir que des caractères alphanumériques, "
 
"des underscores (_), points, traits d'union et doit commencer avec un "
 
"caractère alphanumérique ou un underscore"
 

	
 
msgid "The input is not valid"
 
msgstr "L'entrée n'est pas valide"
 

	
 
msgid "Username %(username)s is not valid"
 
msgstr "Le nom d’utilisateur « %(username)s » n’est pas valide"
 

	
 
msgid "Invalid user group name"
 
msgstr "Nom de groupe d'utilisateurs invalide"
 

	
 
msgid "User group \"%(usergroup)s\" already exists"
 
msgstr "Le groupe d'utilisateurs « %(usergroup)s » existe déjà"
 

	
 
msgid ""
 
"user group name may only contain alphanumeric characters underscores, "
 
"periods or dashes and must begin with alphanumeric character"
 
msgstr ""
 
"Le nom du groupe d'utilisateurs ne peut contenir que des caractères "
 
"alphanumériques, des tirets, des points, des traits d'union et doit "
 
"commencer avec un caractère alphanumérique"
 

	
 
msgid "Cannot assign this group as parent"
 
msgstr "Impossible d’assigner ce groupe en tant que parent"
 

	
 
msgid "Group \"%(group_name)s\" already exists"
 
msgstr "Le groupe « %(group_name)s » existe déjà"
 

	
 
msgid "Repository with name \"%(group_name)s\" already exists"
 
msgstr "Un dépôt portant le nom « %(group_name)s » existe déjà"
 

	
 
msgid "Invalid characters (non-ascii) in password"
 
msgstr "Caractères incorrects (non-ASCII) dans le mot de passe"
 

	
 
msgid "Invalid old password"
 
msgstr "Ancien mot de passe invalide"
 

	
 
msgid "Passwords do not match"
 
msgstr "Les mots de passe ne correspondent pas"
 

	
 
msgid "Invalid username or password"
 
msgstr "Nom d'utilisateur ou mot de passe invalide"
 

	
 
msgid "Repository name %(repo)s is not allowed"
 
msgstr "Le nom de dépôt « %(repo)s » n’est pas autorisé"
 

	
 
msgid "Repository named %(repo)s already exists"
 
msgstr "Un dépôt portant le nom « %(repo)s » existe déjà"
 

	
 
msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\""
 
msgstr "Le dépôt « %(repo)s » existe déjà dans le groupe « %(group)s »"
 

	
 
msgid "Repository group with name \"%(repo)s\" already exists"
 
msgstr "Un groupe de dépôts avec le nom « %(repo)s » existe déjà"
 

	
 
msgid "Invalid repository URL"
 
msgstr "URL de dépôt invalide"
 

	
 
msgid ""
 
"Invalid repository URL. It must be a valid http, https, ssh, svn+http or "
 
"svn+https URL"
 
msgstr ""
 
"URL de dépôt invalide. Ce doit être une URL valide de type http, https, "
 
"ssh, svn+http ou svn+https"
 

	
 
msgid "Fork has to be the same type as parent"
 
msgstr "Le fork doit être du même type que le parent"
 

	
 
msgid "You don't have permissions to create repository in this group"
 
msgstr "Vous n’avez pas la permission de créer un dépôt dans ce"
 

	
 
msgid "no permission to create repository in root location"
 
msgstr "pas de permission de créer un dépôt dans la racine"
 

	
 
msgid "You don't have permissions to create a group in this location"
 
msgstr ""
 
"Vous n'avez pas les permissions pour créer un groupe dans cet endroit"
 

	
 
msgid "This username or user group name is not valid"
 
msgstr ""
 
"Ce nom d'utilisateur ou nom de groupe d'utilisateurs n'est pas valide"
 

	
 
msgid "This is not a valid path"
 
msgstr "Ceci n’est pas un chemin valide"
 

	
 
msgid "This email address is already in use"
 
msgstr "Cette adresse e-mail est déjà enregistrée"
 

	
 
msgid "Email address \"%(email)s\" not found"
 
msgstr "L’adresse e-mail « %(email)s » n’existe pas"
 

	
 
msgid ""
 
"The LDAP Login attribute of the CN must be specified - this is the name "
 
"of the attribute that is equivalent to \"username\""
 
msgstr ""
 
"L’attribut Login du CN doit être spécifié. Cet attribut correspond au nom "
 
"d’utilisateur"
 

	
 
msgid "Please enter a valid IPv4 or IPv6 address"
 
msgstr "Veuillez entrer une adresse IPv4 ou IPv6 valide"
 

	
 
msgid ""
 
"The network size (bits) must be within the range of 0-32 (not %(bits)r)"
 
msgstr ""
 
"La taille du réseau (bits) doit être entre 0 et 32 (et non %(bits)r)"
 

	
 
msgid "Key name can only consist of letters, underscore, dash or numbers"
 
msgstr ""
 
"Le nom de la clé ne peut consister que de letters, de traits d'union, de "
 
"tirets ou de nombres"
 

	
 
msgid "Filename cannot be inside a directory"
 
msgstr "Le nom du fichier ne peut être à l'intérieur d'un répertoire"
 

	
 
msgid "Plugins %(loaded)s and %(next_to_load)s both export the same name"
 
msgstr ""
 
"Les greffons %(loaded)s et %(next_to_load)s exportent tous les deux vers "
 
"le même nom"
 

	
 
msgid "About"
 
msgstr "À propos"
 

	
 
msgid "Add Repository"
 
msgstr "Ajouter un dépôt"
 

	
 
msgid "Add Repository Group"
 
msgstr "Ajouter un groupe de dépôts"
 

	
 
msgid "You have admin right to this group, and can edit it"
 
msgstr ""
 
"Vous avez les droits d'administration sur ce groupe, et pouvez l'éditer"
 

	
 
msgid "Edit Repository Group"
 
msgstr "Modifier le groupe de dépôts"
 

	
 
msgid "Repository"
 
msgstr "Dépôt"
 

	
 
msgid "Description"
 
msgstr "Description"
 

	
 
msgid "Last Change"
 
msgstr "Dernière modification"
 

	
 
msgid "Tip"
 
msgstr "Sommet"
 

	
 
msgid "Owner"
 
msgstr "Propriétaire"
 

	
 
msgid "Log In"
 
msgstr "Connexion"
 

	
 
msgid "Log In to %s"
 
msgstr "Se connecter à %s"
 

	
 
msgid "Username"
 
msgstr "Nom d’utilisateur"
 

	
 
msgid "Password"
 
msgstr "Mot de passe"
 
@@ -2297,202 +2283,192 @@ msgstr "Options de scan"
 

	
 
msgid "Delete records of missing repositories"
 
msgstr "Supprimer les enregistrements de dépôts manquants"
 

	
 
msgid ""
 
"Check this option to remove all comments, pull requests and other records "
 
"related to repositories that no longer exist in the filesystem."
 
msgstr ""
 
"Cocher cette option pour supprimer tous les commentaires, les requêtes de "
 
"pull et d'autres informations liées aux dépôts qui n'existent plus sur le "
 
"système de fichiers."
 

	
 
msgid "Invalidate cache for all repositories"
 
msgstr "Invalider le cache pour tous les dépôts"
 

	
 
msgid "Check this to reload data and clear cache keys for all repositories."
 
msgstr ""
 
"Cocher pour recharger les données et vider le cache pour tous les dépôts."
 

	
 
msgid "Install Git hooks"
 
msgstr "Installer des hooks Git"
 

	
 
msgid ""
 
"Verify if Kallithea's Git hooks are installed for each repository. "
 
"Current hooks will be updated to the latest version."
 
msgstr ""
 
"Vérifier si les hooks Git de Kallithea sont installés pour chaque dépôt. "
 
"Les hooks actuels seront mis à jour vers la dernière version."
 

	
 
msgid "Overwrite existing Git hooks"
 
msgstr "Écraser les hooks Git existants"
 

	
 
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 ""
 
"Lors de l'installation des hooks Git, écraser tous les hooks existants, "
 
"même s'ils ne semblent pas provenir de Kallithea. ATTENTION : cette "
 
"opération détruira tous les hooks Git que vous avez déployés à la main !"
 

	
 
msgid "Rescan Repositories"
 
msgstr "Relancer le scan des dépôts"
 

	
 
msgid "Index build option"
 
msgstr "Option de construction de l'index"
 

	
 
msgid "Build from scratch"
 
msgstr "Construire ex nihilo"
 

	
 
msgid ""
 
"This option completely reindexeses all of the repositories for proper "
 
"fulltext search capabilities."
 
msgstr ""
 
"Cette option ré-indexe complètement tous les dépôts pour pouvoir faire "
 
"des recherches dans le texte complet."
 

	
 
msgid "Reindex"
 
msgstr "Mettre à jour l’index"
 

	
 
msgid "Checking for updates..."
 
msgstr "Vérification des mises à jour…"
 

	
 
msgid "Kallithea version"
 
msgstr "Version de Kallithea"
 

	
 
msgid "Kallithea configuration file"
 
msgstr "Fichier de configuration de Kallithea"
 

	
 
msgid "Python version"
 
msgstr "Version de Python"
 

	
 
msgid "Platform"
 
msgstr "Plateforme"
 

	
 
msgid "Git version"
 
msgstr "Version de Git"
 

	
 
msgid "Git path"
 
msgstr "Chemin de Git"
 

	
 
msgid "Python Packages"
 
msgstr "Paquets Python"
 

	
 
msgid "Show repository size after push"
 
msgstr "Afficher la taille du dépôt après un push"
 

	
 
msgid "Update repository after push (hg update)"
 
msgstr "Mettre à jour les dépôts après un push (hg update)"
 

	
 
msgid "Mercurial extensions"
 
msgstr "Extensions Mercurial"
 

	
 
msgid "Enable largefiles extension"
 
msgstr "Activer l'extension largefiles"
 

	
 
msgid "Enable hgsubversion extension"
 
msgstr "Activer l'extension hgsubversion"
 

	
 
msgid ""
 
"Requires hgsubversion library to be installed. Enables cloning of remote "
 
"Subversion repositories while converting them to Mercurial."
 
msgstr ""
 
"La bibliothèque hgsubversion doit être installée. Elle permet de cloner "
 
"des dépôts SVN distants et de les migrer vers Mercurial."
 

	
 
msgid "Location of repositories"
 
msgstr "Emplacement des dépôts"
 

	
 
msgid ""
 
"Click to unlock. You must restart Kallithea in order to make this setting "
 
"take effect."
 
msgstr ""
 
"Cliquez pour déverrouiller. Vous devez redémarrer Kallithea pour ce que "
 
"réglage prenne effet."
 

	
 
msgid ""
 
"Filesystem location where repositories are stored. After changing this "
 
"value, a restart and rescan of the repository folder are both required."
 
msgstr ""
 
"Emplacement où les dépôts sont stockés sur le système de fichiers. La "
 
"modification de cette valeur nécessite un re-démarrage et un nouveau scan."
 

	
 
msgid "General"
 
msgstr "Général"
 

	
 
msgid "Use repository extra fields"
 
msgstr "Activer les champs supplémentaires sur les dépôts"
 

	
 
msgid "Allows storing additional customized fields per repository."
 
msgstr ""
 
"Permet d'enregistrer des champs personnalisés additionnels pour chaque "
 
"dépôt."
 

	
 
msgid "Show Kallithea version"
 
msgstr "Afficher la version de Kallithea"
 

	
 
msgid ""
 
"Shows or hides a version number of Kallithea displayed in the footer."
 
msgstr ""
 
"Afficher ou cacher le numéro de version de Kallithea dans le pied de page."
 

	
 
msgid "Show user Gravatars"
 
msgstr "Afficher les Gravatars des utilisateurs"
 

	
 
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 ""
 
"L'URL de Gravatar vous permet d'utiliser un autre serveur d'avatars.\n"
 
"                                                        Les variables "
 
"suivantes dans l'URL seront remplacées comme suit :\n"
 
"                                                        {scheme}    "
 
"'http' ou 'https' envoyé à partir du serveur Kallithea en cours "
 
"d'utilisation,\n"
 
"                                                        {email}     "
 
"adresse e-mail de l'utilisateur,\n"
 
"                                                        {md5email}  "
 
"empreinte md5 (hash) de l'adresse e-mail de l'utilisateur (comme sur "
 
"gravatar.com),\n"
 
"                                                        {size}      "
 
"taille de l'image demandée au serveur,\n"
 
"                                                        {netloc}    "
 
"emplacement réseau/hôte du serveur Kallithea en cours d'utilisation."
 

	
 
msgid "Repository page size"
 
msgstr "Taille de la page du dépôt"
 

	
 
msgid ""
 
"Number of items displayed in the repository pages before pagination is "
 
"shown."
 
msgstr ""
 
"Nombre d'éléments affichés dans les pages des dépôts avant d'afficher la "
 
"pagination."
 

	
 
msgid "Admin page size"
 
msgstr "Taille de la page d'admin"
 

	
 
msgid ""
 
"Number of items displayed in the admin pages grids before pagination is "
 
"shown."
 
msgstr ""
 
"Nombre d'éléments affichés dans les grilles des pages admin avant "
 
"d'afficher la pagination."
 

	
 
msgid "Icons"
 
msgstr "Icônes"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "Afficher l’icône de dépôt public sur les dépôts"
 

	
kallithea/i18n/ja/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -342,199 +342,192 @@ msgid "Updated repository group %s"
 
msgstr "リポジトリグループ %s を更新しました"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "リポジトリグループ %s の更新中にエラーが発生しました"
 

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "このグループは %s 個のリポジトリを含んでいるため削除できません"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "このグループは %s 個のサブグループを含んでいるため削除できません"
 

	
 
msgid "Removed repository group %s"
 
msgstr "リポジトリグループ %s を削除しました"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "リポジトリグループ %s の削除中にエラーが発生しました"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "自分自身の管理者としての権限を取り消すことはできません"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "リポジトリグループ権限を更新しました"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "権限の取消中にエラーが発生しました"
 

	
 
msgid "Error creating repository %s"
 
msgstr "リポジトリ %s の作成中にエラーが発生しました"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "リポジトリ %s を %s から作成しました"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "リポジトリ %s を %s としてフォークしました"
 

	
 
msgid "Created repository %s"
 
msgstr "リポジトリ %s を作成しました"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "リポジトリ %s の更新に成功しました"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "リポジトリ %s の更新中にエラーが発生しました"
 

	
 
msgid "Detached %s forks"
 
msgstr "%s 個のフォークを切り離しました"
 

	
 
msgid "Deleted %s forks"
 
msgstr "%s 個のフォークを削除しました"
 

	
 
msgid "Deleted repository %s"
 
msgstr "リポジトリ %s を削除しました"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr ""
 
"フォークしたリポジトリが存在するため、 リポジトリ %s は削除できません"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "%s の削除中にエラーが発生しました"
 

	
 
msgid "Repository permissions updated"
 
msgstr "リポジトリ権限を更新しました"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "フィールドの削除中にエラーが発生しました"
 

	
 
msgid "-- Not a fork --"
 
msgstr "-- フォークではありません --"
 

	
 
msgid "Updated repository visibility in public journal"
 
msgstr "公開ジャーナルでのリポジトリの可視性を更新しました"
 

	
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr "このリポジトリの公開ジャーナルの設定中にエラーが発生しました"
 

	
 
msgid "Nothing"
 
msgstr "ありません"
 

	
 
msgid "Marked repository %s as fork of %s"
 
msgstr "%s リポジトリを %s のフォークとする"
 

	
 
msgid "An error occurred during this operation"
 
msgstr "操作中にエラーが発生しました"
 

	
 
msgid "Pulled from remote location"
 
msgstr "リモートから取得"
 

	
 
msgid "An error occurred during pull from remote location"
 
msgstr "リモートから取得中にエラーが発生しました"
 

	
 
msgid "An error occurred during deletion of repository stats"
 
msgstr "リポジトリステートの削除中にエラーが発生しました"
 

	
 
msgid "Updated VCS settings"
 
msgstr "VCS設定を更新しました"
 

	
 
msgid ""
 
"Unable to activate hgsubversion support. The \"hgsubversion\" library is "
 
"missing"
 
msgstr ""
 
"\"hgsubversion\"ライブラリが見つからないため、hgsubversionサポートを有効に"
 
"出来ません"
 

	
 
msgid "Error occurred while updating application settings"
 
msgstr "アプリケーション設定の更新中にエラーが発生しました"
 

	
 
msgid "Repositories successfully rescanned. Added: %s. Removed: %s."
 
msgstr "リポジトリの再スキャンに成功しました。 追加: %s 削除: %s。"
 

	
 
msgid "Updated application settings"
 
msgstr "アプリケーション設定を更新しました"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "表示設定を更新しました"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr "表示設定の更新中にエラーが発生しました"
 

	
 
msgid "Please enter email address"
 
msgstr "メールアドレスを入力してください"
 

	
 
msgid "Send email task created"
 
msgstr "メール送信タスクを作成しました"
 

	
 
msgid "Added new hook"
 
msgstr "新しいフックを追加しました"
 

	
 
msgid "Updated hooks"
 
msgstr "フックを更新しました"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "フックの作成中にエラーが発生しました"
 

	
 
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 "このページを閲覧するためにはサインインが必要です"
 
@@ -1718,202 +1711,192 @@ msgid "Custom Hooks"
 
msgstr "カスタムフック"
 

	
 
msgid ""
 
"Hooks can be used to trigger actions on certain events such as push / "
 
"pull. They can trigger Python functions or external applications."
 
msgstr ""
 
"フックを使うと、リポジトリへのプッシュやプルといった特定のイベントに合わせ"
 
"て、何らかのアクションを実行できます。フック機能では、Pythonの関数を呼び出"
 
"したり、外部アプリケーションを起動したりできます。"
 

	
 
msgid "Failed to remove hook"
 
msgstr "フックの削除に失敗しました"
 

	
 
msgid "Delete records of missing repositories"
 
msgstr "見つからないリポジトリのレコードを削除"
 

	
 
msgid "Invalidate cache for all repositories"
 
msgstr "すべてのリポジトリのキャッシュを無効化する"
 

	
 
msgid "Install Git hooks"
 
msgstr "Gitフックをインストール"
 

	
 
msgid ""
 
"Verify if Kallithea's Git hooks are installed for each repository. "
 
"Current hooks will be updated to the latest version."
 
msgstr ""
 
"各リポジトリに Kallitheas の Gitフックがインストールされているか確認してく"
 
"ださい。現在のフックは最新版に更新されます"
 

	
 
msgid "Overwrite existing Git hooks"
 
msgstr "既存のGitフックを上書きする"
 

	
 
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フックをインストールするとKallitheaから設定されたものであっても既存の"
 
"フックは全て上書きされます。警告: この操作はあなたが手動で配置したGitのカ"
 
"スタムフックを全て破壊します!"
 

	
 
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 ""
 
"このオプションを使うと、全文検索の機能が正しく発揮されるよう、 Kallithea "
 
"中の全てのファイルのインデックスを再生成します。"
 

	
 
msgid "Reindex"
 
msgstr "再インデックス"
 

	
 
msgid "Checking for updates..."
 
msgstr "更新を確認中..."
 

	
 
msgid "Kallithea version"
 
msgstr "Kallithea バージョン"
 

	
 
msgid "Kallithea configuration file"
 
msgstr "Kallithea の設定ファイル"
 

	
 
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 "largefilesエクステンションを有効にする"
 

	
 
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 ライブラリのインストールが必要です。リモートのSVNリポジトリを"
 
"クローンしてMercurialリポジトリに変換するすることが可能です。"
 

	
 
msgid "Location of repositories"
 
msgstr "リポジトリの場所"
 

	
 
msgid ""
 
"Click to unlock. You must restart Kallithea in order to make this setting "
 
"take effect."
 
msgstr ""
 
"アンロックする。この設定を有効にするためにはKallitheaの再起動が必要です。"
 

	
 
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 "Kallitheaのバージョンを表示する"
 

	
 
msgid ""
 
"Shows or hides a version number of Kallithea displayed in the footer."
 
msgstr ""
 
"フッターに表示されるKallitheaのバージョン番号の表示、非表示を設定します。"
 

	
 
msgid ""
 
"Number of items displayed in the admin pages grids before pagination is "
 
"shown."
 
msgstr "管理ページで、ページ分割しないでグリッドに表示する項目の数"
 

	
 
msgid "Icons"
 
msgstr "アイコン"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "公開リポジトリのアイコンを表示する"
 

	
 
msgid "Show private repository icon on repositories"
 
msgstr "非公開リポジトリのアイコンを表示する"
 

	
 
msgid "Show public/private icons next to repository names."
 
msgstr "リポジトリ名の隣に公開/非公開アイコンを表示します。"
 

	
 
msgid "Meta Tagging"
 
msgstr "メタタグ"
 

	
 
msgid ""
 
"Parses meta tags from the repository description field and turns them "
 
"into colored tags."
 
msgstr "リポジトリの説明のメタタグを解析して色つきのタグに変換します。"
 

	
 
msgid "Stylify recognised meta tags:"
 
msgstr "次のメタタグを変換する:"
 

	
 
msgid "Add user group"
 
msgstr "ユーザーグループを追加"
 

	
 
msgid "User Groups"
 
msgstr "ユーザーグループ"
 

	
 
msgid "Add User Group"
 
msgstr "ユーザーグループを追加"
 

	
 
msgid "Short, optional description for this user group."
 
msgstr "このユーザーグループの簡潔な説明を書いてください。"
 

	
 
msgid "Active"
 
msgstr "アクティブ"
 

	
 
msgid "%s user group settings"
 
msgstr "%s ユーザーグループ設定"
 

	
 
msgid "Show Members"
 
msgstr "メンバーを表示"
 

	
 
msgid "User Group: %s"
 
msgstr "ユーサーグループ: %s"
 

	
 
msgid "Members"
 
msgstr "メンバー"
 

	
 
msgid "Confirm to delete this user group: %s"
 
msgstr "このユーザーグループを削除してもよろしいですか?: %s"
 

	
 
msgid "Delete this user group"
 
msgstr "このユーザーグループを削除"
 

	
 
msgid "No members yet"
 
msgstr "まだメンバーがいません"
kallithea/i18n/pl/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -1262,195 +1262,192 @@ msgid ""
 
msgstr ""
 
"Powinna być krótka i na temat. Użyj pliku README dla dłuższych opisów."
 

	
 
msgid "Optionally select a group to put this repository into."
 
msgstr "Opcjonalnie wybierz grupę do wprowadzenia tego repozytorium."
 

	
 
msgid "Type of repository to create."
 
msgstr "Rodzaj repozytorium do stworzenia."
 

	
 
msgid "Landing revision"
 
msgstr "Docelowa rewizja"
 

	
 
msgid "Remote"
 
msgstr "Zdalnie"
 

	
 
msgid "Statistics"
 
msgstr "Statystyki"
 

	
 
msgid "Set"
 
msgstr "Ustaw"
 

	
 
msgid "Remove from public journal"
 
msgstr "Usuń z dziennika publicznego"
 

	
 
msgid "Confirm to delete this repository: %s"
 
msgstr "Potwierdź usunięcie repozytorium: %s"
 

	
 
msgid "Detach forks"
 
msgstr "Ustaw jako rozwidlenie"
 

	
 
msgid "Delete forks"
 
msgstr "Usuń rozwidlenie"
 

	
 
msgid "Key"
 
msgstr "Klucz"
 

	
 
msgid "Confirm to delete this field: %s"
 
msgstr "Potwierdź, aby usunąć to pole: %s"
 

	
 
msgid "New field key"
 
msgstr "Nowe pole klucza"
 

	
 
msgid "New field label"
 
msgstr "Nowa etykieta pola"
 

	
 
msgid "Enter short label"
 
msgstr "Wpisz krótką etykietę"
 

	
 
msgid "New field description"
 
msgstr "Nowy opis pola"
 

	
 
msgid "Enter description of a field"
 
msgstr "Wprowadź opis pola"
 

	
 
msgid "Default revision for files page, downloads, whoosh and readme"
 
msgstr "Wersja domyślna dla plików stronicowania, pobierania plików, readme"
 

	
 
msgid "Change owner of this repository."
 
msgstr "Zmiana właściciela tego repozytorium."
 

	
 
msgid "Hooks"
 
msgstr "Aktualizacja"
 

	
 
msgid "Send"
 
msgstr "Wyślij"
 

	
 
msgid "Site branding"
 
msgstr "Nazwa strony"
 

	
 
msgid "HTTP authentication realm"
 
msgstr "Sfera uwierzytelniania HTTP"
 

	
 
msgid "Failed to remove hook"
 
msgstr "Nie udało się usunąć hooka"
 

	
 
msgid "Invalidate cache for all repositories"
 
msgstr "Unieważnia cache dla wszystkich repozytoriów"
 

	
 
msgid "Index build option"
 
msgstr "Opcja odbudowy indeksowania"
 

	
 
msgid "Build from scratch"
 
msgstr "Buduj od podstaw"
 

	
 
msgid "Reindex"
 
msgstr "Indeksuj ponownie"
 

	
 
msgid "Show repository size after push"
 
msgstr "Pokaż rozmiar repozytorium po wysłaniu zmian"
 

	
 
msgid "Update repository after push (hg update)"
 
msgstr "Aktualizacja repozytorium po wysłaniu zmian (aktualizacja hg)"
 

	
 
msgid "Enable largefiles extension"
 
msgstr "Rozszerzenia dużych plików"
 

	
 
msgid "Enable hgsubversion extension"
 
msgstr "Rozszerzenia hgsubversion"
 

	
 
msgid ""
 
"Click to unlock. You must restart Kallithea in order to make this setting "
 
"take effect."
 
msgstr ""
 
"Kliknij, aby odblokować. Musisz ponownie uruchomić Kallithea żeby "
 
"wprowadzić to ustawienie w życie."
 

	
 
msgid "General"
 
msgstr "Główne"
 

	
 
msgid "Use repository extra fields"
 
msgstr "Używaj w repozytorium dodatkowych pól"
 

	
 
msgid "Allows storing additional customized fields per repository."
 
msgstr ""
 
"Umożliwia przechowywanie dodatkowych niestandardowych pól w repozytorium."
 

	
 
msgid "Show Kallithea version"
 
msgstr "Pokaż wersję Kallithea"
 

	
 
msgid "Icons"
 
msgstr "Ikony"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "Pokazuj w publicznym repo ikonę w repozytoriach"
 

	
 
msgid "Show private repository icon on repositories"
 
msgstr "Pokazuj w prywatnym repo ikonę w repozytoriach"
 

	
 
msgid "Add user group"
 
msgstr "Dodaj grupę użytkowników"
 

	
 
msgid "Active"
 
msgstr "Aktywny"
 

	
 
msgid "Members"
 
msgstr "Użytkownicy"
 

	
 
msgid "Confirm to delete this user group: %s"
 
msgstr "Potwierdź usunięcie grupy użytkowników: %s"
 

	
 
msgid "No members yet"
 
msgstr "Nie ma jeszcze żadnego użytkownika"
 

	
 
msgid "Chosen group members"
 
msgstr "Wybrane grupy użytkowników"
 

	
 
msgid "Available members"
 
msgstr "Dostępni użytkownicy"
 

	
 
msgid "Add user"
 
msgstr "Dodaj użytkownika"
 

	
 
msgid "Users"
 
msgstr "Użytkownicy"
 

	
 
msgid "Password confirmation"
 
msgstr "Potwierdzenie hasła"
 

	
 
msgid "Confirm to delete this user: %s"
 
msgstr "Potwierdź usunięcie tego użytkownika: %s"
 

	
 
msgid "New password confirmation"
 
msgstr "Potwierdzenie nowego hasła"
 

	
 
msgid "Server instance: %s"
 
msgstr "Wystąpienia serwera: %s"
 

	
 
msgid "Mercurial repository"
 
msgstr "Repozytorium mercurial"
 

	
 
msgid "Git repository"
 
msgstr "Repozytorium git"
 

	
 
msgid "Summary"
 
msgstr "Podsumowanie"
 

	
 
msgid "Changelog"
 
msgstr "Dziennik zmian"
 

	
 
msgid "Files"
 
msgstr "Pliki"
 

	
 
msgid "Show Pull Requests for %s"
 
msgstr "Pokaż Prośby Pobrania %s"
 

	
 
msgid "Pull Requests"
 
msgstr "Połączone gałęzie"
 

	
 
msgid "Options"
 
msgstr "Opcje"
 

	
 
msgid "Compare"
 
msgstr "Porównaj"
 

	
 
msgid "Search"
kallithea/i18n/pt/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -918,195 +918,192 @@ msgid ""
 
msgstr ""
 
"Seja sucinto e objetivo. Use um ficheiro README para descrições mais "
 
"longas."
 

	
 
msgid "Optionally select a group to put this repository into."
 
msgstr "Opcionalmente selecione um grupo no qual pôr esse repositório."
 

	
 
msgid "Type of repository to create."
 
msgstr "Tipo de repositório a criar."
 

	
 
msgid "Landing revision"
 
msgstr "Revisão de pouso"
 

	
 
msgid "Remote"
 
msgstr "Remoto"
 

	
 
msgid "Statistics"
 
msgstr "Estatísticas"
 

	
 
msgid "Remove from public journal"
 
msgstr "Remover do diário público"
 

	
 
msgid "Confirm to delete this repository: %s"
 
msgstr "Confirma apagar esse repositório: %s"
 

	
 
msgid "Detach forks"
 
msgstr "Desassociar bifurcações"
 

	
 
msgid "Delete forks"
 
msgstr "Apagar bifurcações"
 

	
 
msgid "Key"
 
msgstr "Chave"
 

	
 
msgid "Confirm to delete this field: %s"
 
msgstr "Confirme para apagar este campo: %s"
 

	
 
msgid "New field key"
 
msgstr "Próxima chave de campo"
 

	
 
msgid "New field label"
 
msgstr "Próximo rótulo de campo"
 

	
 
msgid "Enter short label"
 
msgstr "Entre com o rótulo curto"
 

	
 
msgid "New field description"
 
msgstr "Nova descrição de campo"
 

	
 
msgid "Enter description of a field"
 
msgstr "Entre com a descrição de um campo"
 

	
 
msgid "Default revision for files page, downloads, whoosh and readme"
 
msgstr ""
 
"Revisão predefinida para página de ficheiros, descarregamentos, whoosh e "
 
"readme"
 

	
 
msgid "Change owner of this repository."
 
msgstr "Mudar o dono desse repositório."
 

	
 
msgid "Hooks"
 
msgstr "Ganchos"
 

	
 
msgid "Send"
 
msgstr "Enviar"
 

	
 
msgid "Site branding"
 
msgstr "Marca do site"
 

	
 
msgid "HTTP authentication realm"
 
msgstr "Realm de autenticação HTTP"
 

	
 
msgid "Failed to remove hook"
 
msgstr "Falha ao remover gancho"
 

	
 
msgid "Invalidate cache for all repositories"
 
msgstr "Invalidar o cache para todos os repositórios"
 

	
 
msgid "Index build option"
 
msgstr "Opção de construção do índice"
 

	
 
msgid "Build from scratch"
 
msgstr "Construir do zero"
 

	
 
msgid "Reindex"
 
msgstr "Reindexar"
 

	
 
msgid "Show repository size after push"
 
msgstr "Mostrar tamanho do repositório após o push"
 

	
 
msgid "Update repository after push (hg update)"
 
msgstr "Atualizar repositório após realizar push (hg update)"
 

	
 
msgid "Enable largefiles extension"
 
msgstr "Ativar extensão largefiles"
 

	
 
msgid "Enable hgsubversion extension"
 
msgstr "Ativar extensão hgsubversion"
 

	
 
msgid ""
 
"Click to unlock. You must restart Kallithea in order to make this setting "
 
"take effect."
 
msgstr ""
 
"Clique para destravar. Deve reiniciar o Kallithea para que esta "
 
"configuração tenha efeito."
 

	
 
msgid "General"
 
msgstr "Geral"
 

	
 
msgid "Use repository extra fields"
 
msgstr "Usar campos extras do repositório"
 

	
 
msgid "Allows storing additional customized fields per repository."
 
msgstr "Permite armazenar campos customizados adicionais por repositório."
 

	
 
msgid "Show Kallithea version"
 
msgstr "Mostrar versão do Kallithea"
 

	
 
msgid "Icons"
 
msgstr "Ícones"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "Mostrar ícone de repositório público nos repositórios"
 

	
 
msgid "Show private repository icon on repositories"
 
msgstr "Mostrar ícone de repositório privado nos repositórios"
 

	
 
msgid "Add user group"
 
msgstr "Adicionar grupo de utilizadores"
 

	
 
msgid "Active"
 
msgstr "Ativo"
 

	
 
msgid "Members"
 
msgstr "Membros"
 

	
 
msgid "Confirm to delete this user group: %s"
 
msgstr "Confirme para apagar este grupo de utilizador: %s"
 

	
 
msgid "No members yet"
 
msgstr "Nenhum membro ainda"
 

	
 
msgid "Chosen group members"
 
msgstr "Membros escolhidos do grupo"
 

	
 
msgid "Available members"
 
msgstr "Membros disponíveis"
 

	
 
msgid "Add user"
 
msgstr "Adicionar utilizador"
 

	
 
msgid "Users"
 
msgstr "Utilizadores"
 

	
 
msgid "Password confirmation"
 
msgstr "Confirmação de palavra-passe"
 

	
 
msgid "Confirm to delete this user: %s"
 
msgstr "Confirma apagar este utilizador: %s"
 

	
 
msgid "New password confirmation"
 
msgstr "Confirmação de nova palavra-passe"
 

	
 
msgid "Server instance: %s"
 
msgstr "Instância de servidor: %s"
 

	
 
msgid "Mercurial repository"
 
msgstr "Repositório Mercurial"
 

	
 
msgid "Git repository"
 
msgstr "Repositório Git"
 

	
 
msgid "Summary"
 
msgstr "Sumário"
 

	
 
msgid "Changelog"
 
msgstr "Registo de alterações"
 

	
 
msgid "Files"
 
msgstr "Ficheiros"
 

	
 
msgid "Show Pull Requests for %s"
 
msgstr "Mostrar Pull Requests para %s"
 

	
 
msgid "Pull Requests"
 
msgstr "Pull Requests"
 

	
 
msgid "Options"
 
msgstr "Opções"
 

	
 
msgid "Compare"
 
msgstr "Compare"
 

	
 
msgid "Search"
 
msgstr "Pesquisar"
kallithea/i18n/pt_BR/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -916,195 +916,192 @@ msgstr "Adicionar novo"
 
msgid ""
 
"Keep it short and to the point. Use a README file for longer descriptions."
 
msgstr ""
 
"Seja sucinto e objetivo. Use um arquivo README para descrições mais "
 
"longas."
 

	
 
msgid "Optionally select a group to put this repository into."
 
msgstr "Opcionalmente selecione um grupo no qual colocar esse repositório."
 

	
 
msgid "Type of repository to create."
 
msgstr "Tipo de repositório a criar."
 

	
 
msgid "Landing revision"
 
msgstr "Revisão de pouso"
 

	
 
msgid "Remote"
 
msgstr "Remoto"
 

	
 
msgid "Statistics"
 
msgstr "Estatísticas"
 

	
 
msgid "Remove from public journal"
 
msgstr "Remover do diário público"
 

	
 
msgid "Confirm to delete this repository: %s"
 
msgstr "Confirma excluir esse repositório: %s"
 

	
 
msgid "Detach forks"
 
msgstr "Desassociar bifurcações"
 

	
 
msgid "Delete forks"
 
msgstr "Excluir bifurcações"
 

	
 
msgid "Key"
 
msgstr "Chave"
 

	
 
msgid "Confirm to delete this field: %s"
 
msgstr "Confirme para excluir este campo: %s"
 

	
 
msgid "New field key"
 
msgstr "Próxima chave de campo"
 

	
 
msgid "New field label"
 
msgstr "Próximo rótulo de campo"
 

	
 
msgid "Enter short label"
 
msgstr "Entre com o rótulo curto"
 

	
 
msgid "New field description"
 
msgstr "Nova descrição de campo"
 

	
 
msgid "Enter description of a field"
 
msgstr "Entre com a descrição de um campo"
 

	
 
msgid "Default revision for files page, downloads, whoosh and readme"
 
msgstr "Revisão padrão para página de arquivos, downloads, whoosh e readme"
 

	
 
msgid "Change owner of this repository."
 
msgstr "Mudar o dono desse repositório."
 

	
 
msgid "Hooks"
 
msgstr "Ganchos"
 

	
 
msgid "Send"
 
msgstr "Enviar"
 

	
 
msgid "Site branding"
 
msgstr "Marca do site"
 

	
 
msgid "HTTP authentication realm"
 
msgstr "Realm de autenticação HTTP"
 

	
 
msgid "Failed to remove hook"
 
msgstr "Falha ao remover gancho"
 

	
 
msgid "Invalidate cache for all repositories"
 
msgstr "Invalidar o cache para todos os repositórios"
 

	
 
msgid "Index build option"
 
msgstr "Opção de construção do índice"
 

	
 
msgid "Build from scratch"
 
msgstr "Construir do zero"
 

	
 
msgid "Reindex"
 
msgstr "Reindexar"
 

	
 
msgid "Show repository size after push"
 
msgstr "Mostrar tamanho do repositório após o push"
 

	
 
msgid "Update repository after push (hg update)"
 
msgstr "Atualizar repositório após realizar push (hg update)"
 

	
 
msgid "Enable largefiles extension"
 
msgstr "Habilitar extensão largefiles"
 

	
 
msgid "Enable hgsubversion extension"
 
msgstr "Habilitar extensão hgsubversion"
 

	
 
msgid ""
 
"Click to unlock. You must restart Kallithea in order to make this setting "
 
"take effect."
 
msgstr ""
 
"Clique para destravar. Você deve reiniciar o Kallithea para que esta "
 
"configuração tenha efeito."
 

	
 
msgid "General"
 
msgstr "Geral"
 

	
 
msgid "Use repository extra fields"
 
msgstr "Usar campos extras do repositório"
 

	
 
msgid "Allows storing additional customized fields per repository."
 
msgstr "Permite armazenar campos customizados adicionais por repositório."
 

	
 
msgid "Show Kallithea version"
 
msgstr "Mostrar versão do Kallithea"
 

	
 
msgid "Icons"
 
msgstr "Ícones"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "Mostrar ícone de repositório público nos repositórios"
 

	
 
msgid "Show private repository icon on repositories"
 
msgstr "Mostrar ícone de repositório privado nos repositórios"
 

	
 
msgid "Add user group"
 
msgstr "Adicionar grupo de usuários"
 

	
 
msgid "Active"
 
msgstr "Ativo"
 

	
 
msgid "Members"
 
msgstr "Membros"
 

	
 
msgid "Confirm to delete this user group: %s"
 
msgstr "Confirme para excluir este grupo de usuário: %s"
 

	
 
msgid "No members yet"
 
msgstr "Nenhum membro ainda"
 

	
 
msgid "Chosen group members"
 
msgstr "Membros escolhidos do grupo"
 

	
 
msgid "Available members"
 
msgstr "Membros disponíveis"
 

	
 
msgid "Add user"
 
msgstr "Adicionar usuário"
 

	
 
msgid "Users"
 
msgstr "Usuários"
 

	
 
msgid "Password confirmation"
 
msgstr "Confirmação de senha"
 

	
 
msgid "Confirm to delete this user: %s"
 
msgstr "Confirma excluir este usuário: %s"
 

	
 
msgid "New password confirmation"
 
msgstr "Confirmação de nova senha"
 

	
 
msgid "Server instance: %s"
 
msgstr "Instância de servidor: %s"
 

	
 
msgid "Mercurial repository"
 
msgstr "Repositório Mercurial"
 

	
 
msgid "Git repository"
 
msgstr "Repositório Git"
 

	
 
msgid "Summary"
 
msgstr "Sumário"
 

	
 
msgid "Changelog"
 
msgstr "Registro de alterações"
 

	
 
msgid "Files"
 
msgstr "Arquivos"
 

	
 
msgid "Show Pull Requests for %s"
 
msgstr "Mostrar Pull Requests para %s"
 

	
 
msgid "Pull Requests"
 
msgstr "Pull Requests"
 

	
 
msgid "Options"
 
msgstr "Opções"
 

	
 
msgid "Compare"
 
msgstr "Compare"
 

	
 
msgid "Search"
 
msgstr "Pesquisar"
kallithea/i18n/ru/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -434,199 +434,192 @@ msgstr "Произошла ошибка при обновлении группы репозиториев %s"
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Данная группа содержит %s репозитариев и не может быть удалена"
 

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

	
 
msgid "Removed repository group %s"
 
msgstr "Группа репозиториев %s удалена"
 

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

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Администратор не может отозвать свои привелегии"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Привилегии группы репозиториев обновлены"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Произошла ошибка при отзыве привелегии"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Произошла ошибка при создании репозитория %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Репозиторий %s создан из %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Создан форк репозитория %s с именем %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Репозиторий %s создан"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Репозитарий %s успешно обновлён"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Произошла ошибка во время обновления репозитория %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "Форки %s отсоединены"
 

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

	
 
msgid "Deleted repository %s"
 
msgstr "Репозиторий %s удалён"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Невозможно удалить репозиторий %s, поскольку существуют его форки"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Произошла ошибка во время удаления %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Привилегии репозитория обновлены"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Ошибка валидации поля: %s"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Произошла ошибка при создании поля: %r"
 

	
 
msgid "An error occurred during removal of field"
 
msgstr "Произошла ошибка при удалении поля"
 

	
 
msgid "-- Not a fork --"
 
msgstr "-- Не является форком --"
 

	
 
msgid "Updated repository visibility in public journal"
 
msgstr "Видимость репозитория в публичном журнале обновлена"
 

	
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr "Произошла ошибка при установке репозитария в общедоступный журнал"
 

	
 
msgid "Nothing"
 
msgstr "Отсутствуют"
 

	
 
msgid "Marked repository %s as fork of %s"
 
msgstr "Репозиторий %s отмечен как форк от %s"
 

	
 
msgid "An error occurred during this operation"
 
msgstr "Произошла ошибка при выполнении операции"
 

	
 
msgid "Pulled from remote location"
 
msgstr "Внесены изменения из удалённого репозитория"
 

	
 
msgid "An error occurred during pull from remote location"
 
msgstr "Произошла ошибка при внесении изменений из удалённого репозитория"
 

	
 
msgid "An error occurred during deletion of repository stats"
 
msgstr "Произошла ошибка при удалении статистики репозитория"
 

	
 
msgid "Updated VCS settings"
 
msgstr "Обновлены настройки VCS"
 

	
 
msgid ""
 
"Unable to activate hgsubversion support. The \"hgsubversion\" library is "
 
"missing"
 
msgstr ""
 
"Невозможно включить поддержку hgsubversion. Библиотека «hgsubversion» "
 
"отсутствует"
 

	
 
msgid "Error occurred while updating application settings"
 
msgstr "Произошла ошибка при обновлении настроек приложения"
 

	
 
msgid "Repositories successfully rescanned. Added: %s. Removed: %s."
 
msgstr "Репозитории успешно пересканированы, добавлено: %s, удалено: %s."
 

	
 
msgid "Invalidated %s repositories"
 
msgstr "Сброшена валидация для %s репозиториев"
 

	
 
msgid "Updated application settings"
 
msgstr "Обновленные параметры настройки приложения"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "Настройки визуализации обновлены"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr "Произошла ошибка при обновлении настроек визуализации"
 

	
 
msgid "Please enter email address"
 
msgstr "Пожалуйста, введите адрес электронной почты"
 

	
 
msgid "Send email task created"
 
msgstr "Задача отправки Email создана"
 

	
 
msgid "Hook already exists"
 
msgstr "Хук уже существует"
 

	
 
msgid "Builtin hooks are read-only. Please use another hook name."
 
msgstr ""
 
"Встроенные хуки предназначены только для чтения. Пожалуйста, используйте "
 
"другое имя."
 

	
 
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"
 
@@ -1101,199 +1094,192 @@ msgid ""
 
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 "Fork has to be the same type as parent"
 
msgstr "Форк будет иметь тот же тип, что и родительский"
 

	
 
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 должно быть указано значение аттрибута 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 ""
 
"Значение маски подсети должно быть в пределах от 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 "Оставаться авторизованным"
 
@@ -2249,202 +2235,192 @@ 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 ""
 
"Отметьте для удаления всех комментариев, pull-запросов и других записей, "
 
"связанных с репозиториями, которые больше не существуют в файловой "
 
"системе."
 

	
 
msgid "Invalidate cache for all repositories"
 
msgstr "Сбросить кэш для всех репозиториев"
 

	
 
msgid "Check this to reload data and clear cache keys for all repositories."
 
msgstr ""
 
"Отметьте, чтобы перезагрузить данные и очистить ключи кэша у всех "
 
"репозиториев."
 

	
 
msgid "Install Git hooks"
 
msgstr "Установить хуки Git"
 

	
 
msgid ""
 
"Verify if Kallithea's Git hooks are installed for each repository. "
 
"Current hooks will be updated to the latest version."
 
msgstr ""
 
"Проверяет установку Git хуков от Kallithea у каждого репозитория. Текущие "
 
"хуки будут обновлены до последней версии."
 

	
 
msgid "Overwrite existing Git hooks"
 
msgstr "Перезаписать существующие хуки"
 

	
 
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, даже если "
 
"они не поставляются с Kallithea. ПРЕДУПРЕЖДЕНИЕ: это действие уничтожит "
 
"любые Git хуки, которые могли быть созданы вручную!"
 

	
 
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 "Версия Kallithea"
 

	
 
msgid "Kallithea configuration file"
 
msgstr "Конфиг. Kallithea"
 

	
 
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 ""
 
"Нажмите для разблокирования. Изменения вступят в силу после перезагрузки "
 
"Kallithea."
 

	
 
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 "Отображать версию Kallithea"
 

	
 
msgid ""
 
"Shows or hides a version number of Kallithea displayed in the footer."
 
msgstr "Показывает или скрывает версию Kallithea внизу страницы."
 

	
 
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 позволяет использовать любой другой сервис аватаров.\n"
 
"                                                        В URL можно "
 
"использовать следующие переменные:\n"
 
"                                                        {scheme}    "
 
"используемый протокол, 'http' или 'https',\n"
 
"                                                        {email}     e-"
 
"mail пользователя,\n"
 
"                                                        {md5email}  хэш "
 
"md5 адреса почты пользователя (как на gravatar.com),\n"
 
"                                                        {size}      "
 
"ожидаемый размер изображения,\n"
 
"                                                        {netloc}    "
 
"сетевой путь/адрес хоста сервера Kallithea"
 

	
 
msgid "HTTP Clone URL"
 
msgstr "Ссылка для клонирования по HTTP"
 

	
 
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 для клонирования, например: '{scheme}://{user}@{netloc}/"
 
"{repo}'.\n"
 
"                                                    Доступны следующие "
 
"переменные:\n"
 
"                                                    {scheme} используемый "
 
"протокол, 'http' or 'https',\n"
 
"                                                    {user}   имя текущего "
kallithea/i18n/uk/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -422,199 +422,192 @@ msgid "This group contains %s repositori
 
msgstr "Ця група містить %s репозиторії, і їх неможливо видалити"
 

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

	
 
msgid "Removed repository group %s"
 
msgstr "Видалена група репозиторіїв %s"
 

	
 
msgid "Error occurred during deletion of repository group %s"
 
msgstr "Сталася помилка під час видалення групи репохиторіїв %s"
 

	
 
msgid "Cannot revoke permission for yourself as admin"
 
msgstr "Неможливо відкликати дозвіл для себе як адміністратора"
 

	
 
msgid "Repository group permissions updated"
 
msgstr "Оновлено дозволи групи репозиторіїв"
 

	
 
msgid "An error occurred during revoking of permission"
 
msgstr "Сталася помилка під час відкликання прав"
 

	
 
msgid "Error creating repository %s"
 
msgstr "Помилка створення репозиторію  %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Створено репозиторій  %s з %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Роздвоєно репозиторій %s як %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Створено репозиторій %s"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Репозиторій %s успішно оновлений"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Сталася помилка при оновленні репозиторію %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "Від'єднано %s forks"
 

	
 
msgid "Deleted %s forks"
 
msgstr "Видалено %s forks"
 

	
 
msgid "Deleted repository %s"
 
msgstr "Видалений репозиторій %s"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Неможливо видалити репозиторій %s, що ще має forks"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Сталася помилка під час видалення %s"
 

	
 
msgid "Repository permissions updated"
 
msgstr "Права доступів до репозиторіїв оновлено"
 

	
 
msgid "Field validation error: %s"
 
msgstr "Помилка перевірки поля: %s"
 

	
 
msgid "An error occurred during creation of field: %r"
 
msgstr "Сталася помилка під час створення поля: %r"
 

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

	
 
msgid "-- Not a fork --"
 
msgstr "-- Не fork --"
 

	
 
msgid "Updated repository visibility in public journal"
 
msgstr "Оновлено видимість репозиторія в публічному журналі"
 

	
 
msgid "An error occurred during setting this repository in public journal"
 
msgstr ""
 
"Сталася помилка під час налаштувань цього репозиторію в публічному журналі"
 

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

	
 
msgid "Marked repository %s as fork of %s"
 
msgstr "Позначено репозиторій %s як відгалуження від %s"
 

	
 
msgid "An error occurred during this operation"
 
msgstr "Сталася помилка під час виконання цієї операції"
 

	
 
msgid "Pulled from remote location"
 
msgstr "Витягнуто з віддаленого місця"
 

	
 
msgid "An error occurred during pull from remote location"
 
msgstr "Сталася помилка під час витягування з віддаленого розташування"
 

	
 
msgid "An error occurred during deletion of repository stats"
 
msgstr "Під час видалення статистики репозиторію сталася помилка"
 

	
 
msgid "Updated VCS settings"
 
msgstr "Оновлені налаштування VCS"
 

	
 
msgid ""
 
"Unable to activate hgsubversion support. The \"hgsubversion\" library is "
 
"missing"
 
msgstr ""
 
"Не вдається активувати підтримку hgsubversion. Бібліотека \"hgsubversion"
 
"\" відсутня"
 

	
 
msgid "Error occurred while updating application settings"
 
msgstr "Під час оновлення параметрів застосунку сталася помилка"
 

	
 
msgid "Repositories successfully rescanned. Added: %s. Removed: %s."
 
msgstr "Репозиторії успішно перескановано. Додано: %s. Видалено: %s."
 

	
 
msgid "Invalidated %s repositories"
 
msgstr "До оновлення %s репозиторіїв"
 

	
 
msgid "Updated application settings"
 
msgstr "Оновлені параметри застосунку"
 

	
 
msgid "Updated visualisation settings"
 
msgstr "Оновлені параметри візуалізації"
 

	
 
msgid "Error occurred during updating visualisation settings"
 
msgstr "Під час оновлення параметрів візуалізації сталася помилка"
 

	
 
msgid "Please enter email address"
 
msgstr "Будь ласка, введіть адресу електронної пошти"
 

	
 
msgid "Send email task created"
 
msgstr "Надіслати електронною поштою завдання створено"
 

	
 
msgid "Hook already exists"
 
msgstr "Hook вже існує"
 

	
 
msgid "Builtin hooks are read-only. Please use another hook name."
 
msgstr ""
 
"Вбудовані hooks доступні лише для читання. Будь ласка, використовуйте "
 
"інше ім'я hook."
 

	
 
msgid "Added new hook"
 
msgstr "Додано новий hook"
 

	
 
msgid "Updated hooks"
 
msgstr "Оновлено hooks"
 

	
 
msgid "Error occurred during hook creation"
 
msgstr "Сталася помилка під час створення hook"
 

	
 
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"
 
@@ -1336,202 +1329,192 @@ 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 ""
 
"Відмітьте це, щоб перезавантажити дані і очистити ключі кешу для всіх "
 
"репозиторіїв."
 

	
 
msgid "Install Git hooks"
 
msgstr "Встановити Git хуки"
 

	
 
msgid ""
 
"Verify if Kallithea's Git hooks are installed for each repository. "
 
"Current hooks will be updated to the latest version."
 
msgstr ""
 
"Перевірити, чи є в Git хуки для кожного репозиторію. Поточні хуки буде "
 
"оновлено до останньої версії."
 

	
 
msgid "Overwrite existing Git hooks"
 
msgstr "Перезаписати існуючі хуки Git"
 

	
 
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 хуків, перезаписати будь-які існуючі хуки, навіть якщо "
 
"вони, здається, не приходять з Каллітея. Увага: ця операція знищить будь-"
 
"які користувацькі хуки Git які ви, можливо, розгорнули вручну!"
 

	
 
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 "Версія Kallithea"
 

	
 
msgid "Kallithea configuration file"
 
msgstr "Файл конфігурації Kallithea"
 

	
 
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 "Показати розмір сховища після push"
 

	
 
msgid "Update repository after push (hg update)"
 
msgstr "Оновлення репозиторію після push (hg update)"
 

	
 
msgid "Mercurial extensions"
 
msgstr "Mercurial  розширення"
 

	
 
msgid "Enable largefiles extension"
 
msgstr "Увімкнути розширення largefiles"
 

	
 
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 ""
 
"Клацніть, щоб розблокувати. Ви повинні перезапустити Kallithea для того, "
 
"щоб ця настройка набула чинності."
 

	
 
msgid "General"
 
msgstr "Загальні"
 

	
 
msgid "Use repository extra fields"
 
msgstr "Використовувати додаткові поля сховища"
 

	
 
msgid "Allows storing additional customized fields per repository."
 
msgstr "Дозволяє зберігати додаткові настроювані поля для кожного сховища."
 

	
 
msgid "Show Kallithea version"
 
msgstr "Показати версію Kallithea"
 

	
 
msgid ""
 
"Shows or hides a version number of Kallithea displayed in the footer."
 
msgstr ""
 
"Показує або приховує номер версії Kallithea, відображений у нижньому "
 
"колонтитулі."
 

	
 
msgid "Show user Gravatars"
 
msgstr "Показати Gravatars користувача"
 

	
 
msgid "Repository page size"
 
msgstr "Розмір сторінки репозиторію"
 

	
 
msgid ""
 
"Number of items displayed in the repository pages before pagination is "
 
"shown."
 
msgstr ""
 
"Кількість елементів, що відображаються на сторінках сховища перед "
 
"показаним нумерацією."
 

	
 
msgid "Admin page size"
 
msgstr "Розмір адмін сторінки"
 

	
 
msgid ""
 
"Number of items displayed in the admin pages grids before pagination is "
 
"shown."
 
msgstr ""
 
"Кількість елементів, що відображаються в сітках адміністратора сторінки "
 
"до відображення нумерації."
 

	
 
msgid "Icons"
 
msgstr "Іконки"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "Показати піктограму загальнодоступного сховища на сховищах"
 

	
 
msgid "Show private repository icon on repositories"
 
msgstr "Показати значок приватної репозиторію на репозиторіїв"
 

	
 
msgid "Show public/private icons next to repository names."
 
msgstr "Показати публічні/приватні значки поруч із назвами сховищ."
 

	
 
msgid "Meta Tagging"
 
msgstr "Мета-теги"
 

	
 
msgid "Active"
 
msgstr "Активний"
 

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

	
 
msgid "Pull Requests"
 
msgstr "Запити Pull Requests"
 

	
 
msgid "Options"
 
msgstr "Параметри"
 

	
 
msgid "Compare Fork"
 
msgstr "Порівняти Вилки"
 

	
 
msgid "Compare"
 
msgstr "Порівняти"
 

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

	
 
msgid "Follow"
 
msgstr "Слідувати"
 

	
 
msgid "Unfollow"
 
msgstr "Не слідкувати"
 

	
 
msgid "Fork"
 
msgstr "Форк"
 

	
kallithea/lib/db_manage.py
Show inline comments
 
@@ -174,169 +174,168 @@ class DbManage(object):
 
                             TEST_USER_REGULAR_EMAIL, False)
 

	
 
            self.create_user(TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS,
 
                             TEST_USER_REGULAR2_EMAIL, False)
 

	
 
    def create_auth_plugin_options(self, skip_existing=False):
 
        """
 
        Create default auth plugin settings, and make it active
 

	
 
        :param skip_existing:
 
        """
 

	
 
        for k, v, t in [('auth_plugins', 'kallithea.lib.auth_modules.auth_internal', 'list'),
 
                        ('auth_internal_enabled', 'True', 'bool')]:
 
            if skip_existing and Setting.get_by_name(k) is not None:
 
                log.debug('Skipping option %s', k)
 
                continue
 
            setting = Setting(k, v, t)
 
            self.sa.add(setting)
 

	
 
    def create_default_options(self, skip_existing=False):
 
        """Creates default settings"""
 

	
 
        for k, v, t in [
 
            ('default_repo_enable_downloads', False, 'bool'),
 
            ('default_repo_enable_statistics', False, 'bool'),
 
            ('default_repo_private', False, 'bool'),
 
            ('default_repo_type', 'hg', 'unicode')
 
        ]:
 
            if skip_existing and Setting.get_by_name(k) is not None:
 
                log.debug('Skipping option %s', k)
 
                continue
 
            setting = Setting(k, v, t)
 
            self.sa.add(setting)
 

	
 
    def prompt_repo_root_path(self, test_repo_path='', retries=3):
 
        _path = self.cli_args.get('repos_location')
 
        if retries == 3:
 
            log.info('Setting up repositories config')
 

	
 
        if _path is not None:
 
            path = _path
 
        elif not self.tests and not test_repo_path:
 
            path = input(
 
                 'Enter a valid absolute path to store repositories. '
 
                 'All repositories in that path will be added automatically:'
 
            )
 
        else:
 
            path = test_repo_path
 
        path_ok = True
 

	
 
        # check proper dir
 
        if not os.path.isdir(path):
 
            path_ok = False
 
            log.error('Given path %s is not a valid directory', path)
 

	
 
        elif not os.path.isabs(path):
 
            path_ok = False
 
            log.error('Given path %s is not an absolute path', path)
 

	
 
        # check if path is at least readable.
 
        if not os.access(path, os.R_OK):
 
            path_ok = False
 
            log.error('Given path %s is not readable', path)
 

	
 
        # check write access, warn user about non writeable paths
 
        elif not os.access(path, os.W_OK) and path_ok:
 
            log.warning('No write permission to given path %s', path)
 
            if not self._ask_ok('Given path %s is not writeable, do you want to '
 
                          'continue with read only mode ? [y/n]' % (path,)):
 
                log.error('Canceled by user')
 
                sys.exit(-1)
 

	
 
        if retries == 0:
 
            sys.exit('max retries reached')
 
        if not path_ok:
 
            if _path is not None:
 
                sys.exit('Invalid repo path: %s' % _path)
 
            retries -= 1
 
            return self.prompt_repo_root_path(test_repo_path, retries) # recursing!!!
 

	
 
        real_path = os.path.normpath(os.path.realpath(path))
 

	
 
        if real_path != os.path.normpath(path):
 
            log.warning('Using normalized path %s instead of %s', real_path, path)
 

	
 
        return real_path
 

	
 
    def create_settings(self, repo_root_path):
 
        ui_config = [
 
            ('paths', '/', repo_root_path, True),
 
            #('phases', 'publish', 'false', False)
 
            ('hooks', Ui.HOOK_UPDATE, 'hg update >&2', False),
 
            ('hooks', Ui.HOOK_REPO_SIZE, 'python:kallithea.lib.hooks.repo_size', True),
 
            ('extensions', 'largefiles', '', True),
 
            ('largefiles', 'usercache', os.path.join(repo_root_path, '.cache', 'largefiles'), True),
 
            ('extensions', 'hgsubversion', '', False),
 
            ('extensions', 'hggit', '', False),
 
        ]
 
        for ui_section, ui_key, ui_value, ui_active in ui_config:
 
            ui_conf = Ui(
 
                ui_section=ui_section,
 
                ui_key=ui_key,
 
                ui_value=ui_value,
 
                ui_active=ui_active)
 
            self.sa.add(ui_conf)
 

	
 
        settings = [
 
            ('realm', 'Kallithea', 'unicode'),
 
            ('title', '', 'unicode'),
 
            ('ga_code', '', 'unicode'),
 
            ('show_public_icon', True, 'bool'),
 
            ('show_private_icon', True, 'bool'),
 
            ('stylify_metalabels', False, 'bool'),
 
            ('dashboard_items', 100, 'int'), # TODO: call it page_size
 
            ('admin_grid_items', 25, 'int'),
 
            ('show_version', True, 'bool'),
 
            ('use_gravatar', True, 'bool'),
 
            ('gravatar_url', User.DEFAULT_GRAVATAR_URL, 'unicode'),
 
            ('clone_uri_tmpl', Repository.DEFAULT_CLONE_URI, 'unicode'),
 
            ('clone_ssh_tmpl', Repository.DEFAULT_CLONE_SSH, 'unicode'),
 
        ]
 
        for key, val, type_ in settings:
 
            sett = Setting(key, val, type_)
 
            self.sa.add(sett)
 

	
 
        self.create_auth_plugin_options()
 
        self.create_default_options()
 

	
 
        log.info('Populated Ui and Settings defaults')
 

	
 
    def create_user(self, username, password, email='', admin=False):
 
        log.info('creating user %s', username)
 
        UserModel().create_or_update(username, password, email,
 
                                     firstname='Kallithea', lastname='Admin',
 
                                     active=True, admin=admin,
 
                                     extern_type=User.DEFAULT_AUTH_TYPE)
 

	
 
    def create_default_user(self):
 
        log.info('creating default user')
 
        # create default user for handling default permissions.
 
        user = UserModel().create_or_update(username=User.DEFAULT_USER_NAME,
 
                                            password=str(uuid.uuid1())[:20],
 
                                            email='anonymous@kallithea-scm.org',
 
                                            firstname='Anonymous',
 
                                            lastname='User')
 
        # based on configuration options activate/deactivate this user which
 
        # controls anonymous access
 
        if self.cli_args.get('public_access') is False:
 
            log.info('Public access disabled')
 
            user.active = False
 
            Session().commit()
 

	
 
    def create_permissions(self):
 
        """
 
        Creates all permissions defined in the system
 
        """
 
        # module.(access|create|change|delete)_[name]
 
        # module.(none|read|write|admin)
 
        log.info('creating permissions')
 
        PermissionModel().create_permissions()
 

	
 
    def populate_default_permissions(self):
 
        """
 
        Populate default permissions. It will create only the default
 
        permissions that are missing, and not alter already defined ones
 
        """
 
        log.info('creating default user permissions')
 
        PermissionModel().create_default_permissions(user=User.DEFAULT_USER_NAME)
kallithea/lib/exceptions.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program is distributed in the hope that it will be useful,
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
# GNU General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
"""
 
kallithea.lib.exceptions
 
~~~~~~~~~~~~~~~~~~~~~~~~
 

	
 
Set of custom exceptions used in Kallithea
 

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

	
 
class LdapUsernameError(Exception):
 
    pass
 

	
 

	
 
class LdapPasswordError(Exception):
 
    pass
 

	
 

	
 
class LdapConnectionError(Exception):
 
    pass
 

	
 

	
 
class LdapImportError(Exception):
 
    pass
 

	
 

	
 
class DefaultUserException(Exception):
 
    """An invalid action was attempted on the default user"""
 
    pass
 

	
 

	
 
class UserOwnsReposException(Exception):
 
    pass
 

	
 

	
 
class UserGroupsAssignedException(Exception):
 
    pass
 

	
 

	
 
class AttachedForksError(Exception):
 
    pass
 

	
 

	
 
class RepoGroupAssignmentError(Exception):
 
    pass
 

	
 

	
 
class NonRelativePathError(Exception):
 
    pass
 

	
 

	
 
class IMCCommitError(Exception):
 
    pass
 

	
 

	
 
class UserCreationError(Exception):
 
    pass
 

	
 

	
 
class HgsubversionImportError(Exception):
 
    pass
 

	
 
class InvalidCloneUriException(Exception):
 
    pass
kallithea/lib/utils.py
Show inline comments
 
@@ -144,213 +144,205 @@ def action_logger(user, action, repo, ip
 
        repo_name = repo.lstrip('/')
 
        repo_obj = Repository.get_by_repo_name(repo_name)
 
    else:
 
        repo_obj = None
 
        repo_name = ''
 

	
 
    user_log = UserLog()
 
    user_log.user_id = user_obj.user_id
 
    user_log.username = user_obj.username
 
    user_log.action = action
 

	
 
    user_log.repository = repo_obj
 
    user_log.repository_name = repo_name
 

	
 
    user_log.action_date = datetime.datetime.now()
 
    user_log.user_ip = ipaddr
 
    meta.Session().add(user_log)
 

	
 
    log.info('Logging action:%s on %s by user:%s ip:%s',
 
             action, repo, user_obj, ipaddr)
 
    if commit:
 
        meta.Session().commit()
 

	
 

	
 
def get_filesystem_repos(path):
 
    """
 
    Scans given path for repos and return (name,(type,path)) tuple
 

	
 
    :param path: path to scan for repositories
 
    :param recursive: recursive search and return names with subdirs in front
 
    """
 

	
 
    # remove ending slash for better results
 
    path = path.rstrip(os.sep)
 
    log.debug('now scanning in %s', path)
 

	
 
    def isdir(*n):
 
        return os.path.isdir(os.path.join(*n))
 

	
 
    for root, dirs, _files in os.walk(path):
 
        recurse_dirs = []
 
        for subdir in dirs:
 
            # skip removed repos
 
            if REMOVED_REPO_PAT.match(subdir):
 
                continue
 

	
 
            # skip .<something> dirs TODO: rly? then we should prevent creating them ...
 
            if subdir.startswith('.'):
 
                continue
 

	
 
            cur_path = os.path.join(root, subdir)
 
            if isdir(cur_path, '.git'):
 
                log.warning('ignoring non-bare Git repo: %s', cur_path)
 
                continue
 

	
 
            if (isdir(cur_path, '.hg') or
 
                isdir(cur_path, '.svn') or
 
                isdir(cur_path, 'objects') and (isdir(cur_path, 'refs') or
 
                                                os.path.isfile(os.path.join(cur_path, 'packed-refs')))):
 

	
 
                if not os.access(cur_path, os.R_OK) or not os.access(cur_path, os.X_OK):
 
                    log.warning('ignoring repo path without access: %s', cur_path)
 
                    continue
 

	
 
                if not os.access(cur_path, os.W_OK):
 
                    log.warning('repo path without write access: %s', cur_path)
 

	
 
                try:
 
                    scm_info = get_scm(cur_path)
 
                    assert cur_path.startswith(path)
 
                    repo_path = cur_path[len(path) + 1:]
 
                    yield repo_path, scm_info
 
                    continue # no recursion
 
                except VCSError:
 
                    # We should perhaps ignore such broken repos, but especially
 
                    # the bare git detection is unreliable so we dive into it
 
                    pass
 

	
 
            recurse_dirs.append(subdir)
 

	
 
        dirs[:] = recurse_dirs
 

	
 

	
 
def is_valid_repo_uri(repo_type, url, ui):
 
    """Check if the url seems like a valid remote repo location
 
    Raise InvalidCloneUriException if any problems"""
 
    if repo_type == 'hg':
 
        if url.startswith('http') or url.startswith('ssh'):
 
            # initially check if it's at least the proper URL
 
            # or does it pass basic auth
 
            try:
 
                MercurialRepository._check_url(url, ui)
 
            except urllib.error.URLError as e:
 
                raise InvalidCloneUriException('URI %s URLError: %s' % (url, e))
 
            except mercurial.error.RepoError as e:
 
                raise InvalidCloneUriException('Mercurial %s: %s' % (type(e).__name__, safe_str(bytes(e))))
 
        elif url.startswith('svn+http'):
 
            try:
 
                from hgsubversion.svnrepo import svnremoterepo
 
            except ImportError:
 
                raise InvalidCloneUriException('URI type %s not supported - hgsubversion is not available' % (url,))
 
            svnremoterepo(ui, url).svn.uuid
 
        elif url.startswith('git+http'):
 
            raise InvalidCloneUriException('URI type %s not implemented' % (url,))
 
        else:
 
            raise InvalidCloneUriException('URI %s not allowed' % (url,))
 

	
 
    elif repo_type == 'git':
 
        if url.startswith('http') or url.startswith('git'):
 
            # initially check if it's at least the proper URL
 
            # or does it pass basic auth
 
            try:
 
                GitRepository._check_url(url)
 
            except urllib.error.URLError as e:
 
                raise InvalidCloneUriException('URI %s URLError: %s' % (url, e))
 
        elif url.startswith('svn+http'):
 
            raise InvalidCloneUriException('URI type %s not implemented' % (url,))
 
        elif url.startswith('hg+http'):
 
            raise InvalidCloneUriException('URI type %s not implemented' % (url,))
 
        else:
 
            raise InvalidCloneUriException('URI %s not allowed' % (url))
 

	
 

	
 
def is_valid_repo(repo_name, base_path, scm=None):
 
    """
 
    Returns True if given path is a valid repository False otherwise.
 
    If scm param is given also compare if given scm is the same as expected
 
    from scm parameter
 

	
 
    :param repo_name:
 
    :param base_path:
 
    :param scm:
 

	
 
    :return True: if given path is a valid repository
 
    """
 
    # TODO: paranoid security checks?
 
    full_path = os.path.join(base_path, repo_name)
 

	
 
    try:
 
        scm_ = get_scm(full_path)
 
        if scm:
 
            return scm_[0] == scm
 
        return True
 
    except VCSError:
 
        return False
 

	
 

	
 
def is_valid_repo_group(repo_group_name, base_path, skip_path_check=False):
 
    """
 
    Returns True if given path is a repository group False otherwise
 

	
 
    :param repo_name:
 
    :param base_path:
 
    """
 
    full_path = os.path.join(base_path, repo_group_name)
 

	
 
    # check if it's not a repo
 
    if is_valid_repo(repo_group_name, base_path):
 
        return False
 

	
 
    try:
 
        # we need to check bare git repos at higher level
 
        # since we might match branches/hooks/info/objects or possible
 
        # other things inside bare git repo
 
        get_scm(os.path.dirname(full_path))
 
        return False
 
    except VCSError:
 
        pass
 

	
 
    # check if it's a valid path
 
    if skip_path_check or os.path.isdir(full_path):
 
        return True
 

	
 
    return False
 

	
 

	
 
def make_ui(repo_path=None):
 
    """
 
    Create an Mercurial 'ui' object based on database Ui settings, possibly
 
    augmenting with content from a hgrc file.
 
    """
 
    baseui = mercurial.ui.ui()
 

	
 
    # clean the baseui object
 
    baseui._ocfg = mercurial.config.config()
 
    baseui._ucfg = mercurial.config.config()
 
    baseui._tcfg = mercurial.config.config()
 

	
 
    sa = meta.Session()
 
    for ui_ in sa.query(Ui).order_by(Ui.ui_section, Ui.ui_key):
 
        if ui_.ui_active:
 
            log.debug('config from db: [%s] %s=%r', ui_.ui_section,
 
                      ui_.ui_key, ui_.ui_value)
 
            baseui.setconfig(ascii_bytes(ui_.ui_section), ascii_bytes(ui_.ui_key),
 
                             b'' if ui_.ui_value is None else safe_bytes(ui_.ui_value))
 

	
 
    # force set push_ssl requirement to False, Kallithea handles that
 
    baseui.setconfig(b'web', b'push_ssl', False)
 
    baseui.setconfig(b'web', b'allow_push', b'*')
 
    # prevent interactive questions for ssh password / passphrase
 
    ssh = baseui.config(b'ui', b'ssh', default=b'ssh')
 
    baseui.setconfig(b'ui', b'ssh', b'%s -oBatchMode=yes -oIdentitiesOnly=yes' % ssh)
 
    # push / pull hooks
 
    baseui.setconfig(b'hooks', b'changegroup.kallithea_log_push_action', b'python:kallithea.lib.hooks.log_push_action')
 
    baseui.setconfig(b'hooks', b'outgoing.kallithea_log_pull_action', b'python:kallithea.lib.hooks.log_pull_action')
 

	
 
    if repo_path is not None:
 
        # Note: MercurialRepository / mercurial.localrepo.instance will do this too, so it will always be possible to override db settings or what is hardcoded above
 
        baseui.readconfig(repo_path)
 

	
 
    assert baseui.plain()  # set by hgcompat.monkey_do (invoked from import of vcs.backends.hg) to minimize potential impact of loading config files
 
    return baseui
 

	
kallithea/lib/vcs/backends/base.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
"""
 
    vcs.backends.base
 
    ~~~~~~~~~~~~~~~~~
 

	
 
    Base for all available scm backends
 

	
 
    :created_on: Apr 8, 2010
 
    :copyright: (c) 2010-2011 by Marcin Kuzminski, Lukasz Balcerzak.
 
"""
 

	
 
import datetime
 
import itertools
 

	
 
from kallithea.lib.vcs.conf import settings
 
from kallithea.lib.vcs.exceptions import (ChangesetError, EmptyRepositoryError, NodeAlreadyAddedError, NodeAlreadyChangedError, NodeAlreadyExistsError,
 
                                          NodeAlreadyRemovedError, NodeDoesNotExistError, NodeNotChangedError, RepositoryError)
 
from kallithea.lib.vcs.utils import author_email, author_name
 
from kallithea.lib.vcs.utils.helpers import get_dict_for_attrs
 
from kallithea.lib.vcs.utils.lazy import LazyProperty
 

	
 

	
 
class BaseRepository(object):
 
    """
 
    Base Repository for final backends
 

	
 
    **Attributes**
 

	
 
        ``DEFAULT_BRANCH_NAME``
 
            name of default branch (i.e. "trunk" for svn, "master" for git etc.
 
            name of default branch (i.e. "master" for git etc.
 

	
 
        ``scm``
 
            alias of scm, i.e. *git* or *hg*
 

	
 
        ``repo``
 
            object from external api
 

	
 
        ``revisions``
 
            list of all available revisions' ids, in ascending order
 

	
 
        ``changesets``
 
            storage dict caching returned changesets
 

	
 
        ``path``
 
            absolute path to the repository
 

	
 
        ``branches``
 
            branches as list of changesets
 

	
 
        ``tags``
 
            tags as list of changesets
 
    """
 
    scm = None
 
    DEFAULT_BRANCH_NAME = None
 
    EMPTY_CHANGESET = '0' * 40
 

	
 
    def __init__(self, repo_path, create=False, **kwargs):
 
        """
 
        Initializes repository. Raises RepositoryError if repository could
 
        not be find at the given ``repo_path`` or directory at ``repo_path``
 
        exists and ``create`` is set to True.
 

	
 
        :param repo_path: local path of the repository
 
        :param create=False: if set to True, would try to create repository.
 
        :param src_url=None: if set, should be proper url from which repository
 
          would be cloned; requires ``create`` parameter to be set to True -
 
          raises RepositoryError if src_url is set and create evaluates to
 
          False
 
        """
 
        raise NotImplementedError
 

	
 
    def __str__(self):
 
        return '<%s at %s>' % (self.__class__.__name__, self.path)
 

	
 
    def __repr__(self):
 
        return self.__str__()
 

	
 
    def __len__(self):
 
        return self.count()
 

	
 
    def __eq__(self, other):
 
        same_instance = isinstance(other, self.__class__)
 
        return same_instance and getattr(other, 'path', None) == self.path
 

	
 
    def __ne__(self, other):
 
        return not self.__eq__(other)
 

	
 
    @LazyProperty
 
    def alias(self):
 
        for k, v in settings.BACKENDS.items():
 
            if v.split('.')[-1] == str(self.__class__.__name__):
 
                return k
 

	
 
    @LazyProperty
 
    def name(self):
 
        """
 
        Return repository name (without group name)
 
        """
 
        raise NotImplementedError
 

	
 
    @LazyProperty
 
    def owner(self):
 
        raise NotImplementedError
 

	
 
    @LazyProperty
 
    def description(self):
 
        raise NotImplementedError
 

	
 
    @LazyProperty
 
    def size(self):
 
        """
 
        Returns combined size in bytes for all repository files
 
        """
 

	
 
        size = 0
 
        try:
 
            tip = self.get_changeset()
 
            for topnode, dirs, files in tip.walk('/'):
 
                for f in files:
 
                    size += tip.get_file_size(f.path)
 

	
 
        except RepositoryError as e:
 
            pass
 
        return size
 

	
 
    def is_valid(self):
 
@@ -231,194 +231,193 @@ class BaseRepository(object):
 
        Returns ``InMemoryChangeset`` object for this repository.
 
        """
 
        raise NotImplementedError
 

	
 
    def add(self, filenode, **kwargs):
 
        """
 
        Commit api function that will add given ``FileNode`` into this
 
        repository.
 

	
 
        :raises ``NodeAlreadyExistsError``: if there is a file with same path
 
          already in repository
 
        :raises ``NodeAlreadyAddedError``: if given node is already marked as
 
          *added*
 
        """
 
        raise NotImplementedError
 

	
 
    def remove(self, filenode, **kwargs):
 
        """
 
        Commit api function that will remove given ``FileNode`` into this
 
        repository.
 

	
 
        :raises ``EmptyRepositoryError``: if there are no changesets yet
 
        :raises ``NodeDoesNotExistError``: if there is no file with given path
 
        """
 
        raise NotImplementedError
 

	
 
    def commit(self, message, **kwargs):
 
        """
 
        Persists current changes made on this repository and returns newly
 
        created changeset.
 
        """
 
        raise NotImplementedError
 

	
 
    def get_state(self):
 
        """
 
        Returns dictionary with ``added``, ``changed`` and ``removed`` lists
 
        containing ``FileNode`` objects.
 
        """
 
        raise NotImplementedError
 

	
 
    def get_config_value(self, section, name, config_file=None):
 
        """
 
        Returns configuration value for a given [``section``] and ``name``.
 

	
 
        :param section: Section we want to retrieve value from
 
        :param name: Name of configuration we want to retrieve
 
        :param config_file: A path to file which should be used to retrieve
 
          configuration from (might also be a list of file paths)
 
        """
 
        raise NotImplementedError
 

	
 
    def get_user_name(self, config_file=None):
 
        """
 
        Returns user's name from global configuration file.
 

	
 
        :param config_file: A path to file which should be used to retrieve
 
          configuration from (might also be a list of file paths)
 
        """
 
        raise NotImplementedError
 

	
 
    def get_user_email(self, config_file=None):
 
        """
 
        Returns user's email from global configuration file.
 

	
 
        :param config_file: A path to file which should be used to retrieve
 
          configuration from (might also be a list of file paths)
 
        """
 
        raise NotImplementedError
 

	
 
    # =========== #
 
    # WORKDIR API #
 
    # =========== #
 

	
 
    @LazyProperty
 
    def workdir(self):
 
        """
 
        Returns ``Workdir`` instance for this repository.
 
        """
 
        raise NotImplementedError
 

	
 

	
 
class BaseChangeset(object):
 
    """
 
    Each backend should implement it's changeset representation.
 

	
 
    **Attributes**
 

	
 
        ``repository``
 
            repository object within which changeset exists
 

	
 
        ``raw_id``
 
            raw changeset representation (i.e. full 40 length sha for git
 
            backend)
 

	
 
        ``short_id``
 
            shortened (if apply) version of ``raw_id``; it would be simple
 
            shortcut for ``raw_id[:12]`` for git/mercurial backends or same
 
            as ``raw_id`` for subversion
 
            shortcut for ``raw_id[:12]`` for git/mercurial backends
 

	
 
        ``revision``
 
            revision number as integer
 

	
 
        ``files``
 
            list of ``FileNode`` (``Node`` with NodeKind.FILE) objects
 

	
 
        ``dirs``
 
            list of ``DirNode`` (``Node`` with NodeKind.DIR) objects
 

	
 
        ``nodes``
 
            combined list of ``Node`` objects
 

	
 
        ``author``
 
            author of the changeset, as str
 

	
 
        ``message``
 
            message of the changeset, as str
 

	
 
        ``parents``
 
            list of parent changesets
 

	
 
        ``last``
 
            ``True`` if this is last changeset in repository, ``False``
 
            otherwise; trying to access this attribute while there is no
 
            changesets would raise ``EmptyRepositoryError``
 
    """
 
    def __str__(self):
 
        return '<%s at %s:%s>' % (self.__class__.__name__, self.revision,
 
            self.short_id)
 

	
 
    def __repr__(self):
 
        return self.__str__()
 

	
 
    def __eq__(self, other):
 
        if type(self) is not type(other):
 
            return False
 
        return self.raw_id == other.raw_id
 

	
 
    def __json__(self, with_file_list=False):
 
        if with_file_list:
 
            return dict(
 
                short_id=self.short_id,
 
                raw_id=self.raw_id,
 
                revision=self.revision,
 
                message=self.message,
 
                date=self.date,
 
                author=self.author,
 
                added=[el.path for el in self.added],
 
                changed=[el.path for el in self.changed],
 
                removed=[el.path for el in self.removed],
 
            )
 
        else:
 
            return dict(
 
                short_id=self.short_id,
 
                raw_id=self.raw_id,
 
                revision=self.revision,
 
                message=self.message,
 
                date=self.date,
 
                author=self.author,
 
            )
 

	
 
    @LazyProperty
 
    def last(self):
 
        if self.repository is None:
 
            raise ChangesetError("Cannot check if it's most recent revision")
 
        return self.raw_id == self.repository.revisions[-1]
 

	
 
    @LazyProperty
 
    def parents(self):
 
        """
 
        Returns list of parents changesets.
 
        """
 
        raise NotImplementedError
 

	
 
    @LazyProperty
 
    def children(self):
 
        """
 
        Returns list of children changesets.
 
        """
 
        raise NotImplementedError
 

	
 
    @LazyProperty
 
    def raw_id(self):
 
        """
 
        Returns raw string identifying this changeset.
 
        """
 
        raise NotImplementedError
 

	
 
    @LazyProperty
 
    def short_id(self):
 
        """
 
        Returns shortened version of ``raw_id`` attribute, as string,
 
        identifying this changeset, useful for web representation.
 
        """
 
        raise NotImplementedError
kallithea/lib/vcs/backends/hg/repository.py
Show inline comments
 
@@ -242,193 +242,193 @@ class MercurialRepository(BaseRepository
 
                  context=3):
 
        """
 
        Returns (git like) *diff*, as plain text. Shows changes introduced by
 
        ``rev2`` since ``rev1``.
 

	
 
        :param rev1: Entry point from which diff is shown. Can be
 
          ``self.EMPTY_CHANGESET`` - in this case, patch showing all
 
          the changes since empty state of the repository until ``rev2``
 
        :param rev2: Until which revision changes should be shown.
 
        :param ignore_whitespace: If set to ``True``, would not show whitespace
 
          changes. Defaults to ``False``.
 
        :param context: How many lines before/after changed lines should be
 
          shown. Defaults to ``3``. If negative value is passed-in, it will be
 
          set to ``0`` instead.
 
        """
 

	
 
        # Negative context values make no sense, and will result in
 
        # errors. Ensure this does not happen.
 
        if context < 0:
 
            context = 0
 

	
 
        if hasattr(rev1, 'raw_id'):
 
            rev1 = getattr(rev1, 'raw_id')
 

	
 
        if hasattr(rev2, 'raw_id'):
 
            rev2 = getattr(rev2, 'raw_id')
 

	
 
        # Check if given revisions are present at repository (may raise
 
        # ChangesetDoesNotExistError)
 
        if rev1 != self.EMPTY_CHANGESET:
 
            self.get_changeset(rev1)
 
        self.get_changeset(rev2)
 
        if path:
 
            file_filter = mercurial.match.exact([safe_bytes(path)])
 
        else:
 
            file_filter = None
 

	
 
        return b''.join(mercurial.patch.diff(self._repo, rev1, rev2, match=file_filter,
 
                          opts=mercurial.mdiff.diffopts(git=True,
 
                                        showfunc=True,
 
                                        ignorews=ignore_whitespace,
 
                                        context=context)))
 

	
 
    @classmethod
 
    def _check_url(cls, url, repoui=None):
 
        """
 
        Function will check given url and try to verify if it's a valid
 
        link. Sometimes it may happened that mercurial will issue basic
 
        auth request that can cause whole API to hang when used from python
 
        or other external calls.
 

	
 
        On failures it'll raise urllib2.HTTPError, exception is also thrown
 
        when the return code is non 200
 
        """
 
        # check first if it's not an local url
 
        url = safe_bytes(url)
 
        if os.path.isdir(url) or url.startswith(b'file:'):
 
            return True
 

	
 
        if url.startswith(b'ssh:'):
 
            # in case of invalid uri or authentication issues, sshpeer will
 
            # throw an exception.
 
            mercurial.sshpeer.instance(repoui or mercurial.ui.ui(), url, False).lookup(b'tip')
 
            return True
 

	
 
        url_prefix = None
 
        if b'+' in url[:url.find(b'://')]:
 
            url_prefix, url = url.split(b'+', 1)
 

	
 
        url_obj = mercurial.util.url(url)
 
        test_uri, handlers = get_urllib_request_handlers(url_obj)
 

	
 
        url_obj.passwd = b'*****'
 
        cleaned_uri = str(url_obj)
 

	
 
        o = urllib.request.build_opener(*handlers)
 
        o.addheaders = [('Content-Type', 'application/mercurial-0.1'),
 
                        ('Accept', 'application/mercurial-0.1')]
 

	
 
        req = urllib.request.Request(
 
            "%s?%s" % (
 
                safe_str(test_uri),
 
                urllib.parse.urlencode({
 
                    'cmd': 'between',
 
                    'pairs': "%s-%s" % ('0' * 40, '0' * 40),
 
                })
 
            ))
 

	
 
        try:
 
            resp = o.open(req)
 
            if resp.code != 200:
 
                raise Exception('Return Code is not 200')
 
        except Exception as e:
 
            # means it cannot be cloned
 
            raise urllib.error.URLError("[%s] org_exc: %s" % (cleaned_uri, e))
 

	
 
        if not url_prefix: # skip svn+http://... (and git+... too)
 
        if not url_prefix: # skip git+http://... etc
 
            # now check if it's a proper hg repo
 
            try:
 
                mercurial.httppeer.instance(repoui or mercurial.ui.ui(), url, False).lookup(b'tip')
 
            except Exception as e:
 
                raise urllib.error.URLError(
 
                    "url [%s] does not look like an hg repo org_exc: %s"
 
                    % (cleaned_uri, e))
 

	
 
        return True
 

	
 
    def _get_repo(self, create, src_url=None, update_after_clone=False):
 
        """
 
        Function will check for mercurial repository in given path and return
 
        a localrepo object. If there is no repository in that path it will
 
        raise an exception unless ``create`` parameter is set to True - in
 
        that case repository would be created and returned.
 
        If ``src_url`` is given, would try to clone repository from the
 
        location at given clone_point. Additionally it'll make update to
 
        working copy accordingly to ``update_after_clone`` flag
 
        """
 
        try:
 
            if src_url:
 
                url = safe_bytes(self._get_url(src_url))
 
                opts = {}
 
                if not update_after_clone:
 
                    opts.update({'noupdate': True})
 
                MercurialRepository._check_url(url, self.baseui)
 
                mercurial.commands.clone(self.baseui, url, safe_bytes(self.path), **opts)
 

	
 
                # Don't try to create if we've already cloned repo
 
                create = False
 
            return mercurial.localrepo.instance(self.baseui, safe_bytes(self.path), create=create)
 
        except (mercurial.error.Abort, mercurial.error.RepoError) as err:
 
            if create:
 
                msg = "Cannot create repository at %s. Original error was %s" \
 
                    % (self.name, err)
 
            else:
 
                msg = "Not valid repository at %s. Original error was %s" \
 
                    % (self.name, err)
 
            raise RepositoryError(msg)
 

	
 
    @LazyProperty
 
    def in_memory_changeset(self):
 
        return MercurialInMemoryChangeset(self)
 

	
 
    @LazyProperty
 
    def description(self):
 
        _desc = self._repo.ui.config(b'web', b'description', None, untrusted=True)
 
        return safe_str(_desc or b'unknown')
 

	
 
    @LazyProperty
 
    def contact(self):
 
        return safe_str(mercurial.hgweb.common.get_contact(self._repo.ui.config)
 
                            or b'Unknown')
 

	
 
    @LazyProperty
 
    def last_change(self):
 
        """
 
        Returns last change made on this repository as datetime object
 
        """
 
        return date_fromtimestamp(self._get_mtime(), makedate()[1])
 

	
 
    def _get_mtime(self):
 
        try:
 
            return time.mktime(self.get_changeset().date.timetuple())
 
        except RepositoryError:
 
            # fallback to filesystem
 
            cl_path = os.path.join(self.path, '.hg', "00changelog.i")
 
            st_path = os.path.join(self.path, '.hg', "store")
 
            if os.path.exists(cl_path):
 
                return os.stat(cl_path).st_mtime
 
            else:
 
                return os.stat(st_path).st_mtime
 

	
 
    def _get_revision(self, revision):
 
        """
 
        Given any revision identifier, returns a 40 char string with revision hash.
 

	
 
        :param revision: str or int or None
 
        """
 
        if self._empty:
 
            raise EmptyRepositoryError("There are no changesets yet")
 

	
 
        if revision in [-1, None]:
 
            revision = b'tip'
 
        elif isinstance(revision, str):
 
            revision = safe_bytes(revision)
 

	
 
        try:
 
            if isinstance(revision, int):
 
                return ascii_str(self._repo[revision].hex())
 
            return ascii_str(mercurial.scmutil.revsymbol(self._repo, revision).hex())
 
        except (IndexError, ValueError, mercurial.error.RepoLookupError, TypeError):
 
            msg = "Revision %r does not exist for %s" % (safe_str(revision), self.name)
 
            raise ChangesetDoesNotExistError(msg)
 
        except (LookupError, ):
kallithea/lib/vcs/nodes.py
Show inline comments
 
@@ -494,113 +494,113 @@ class DirNode(Node):
 
    def files(self):
 
        return sorted((node for node in self.nodes if node.is_file()))
 

	
 
    @LazyProperty
 
    def dirs(self):
 
        return sorted((node for node in self.nodes if node.is_dir()))
 

	
 
    def __iter__(self):
 
        for node in self.nodes:
 
            yield node
 

	
 
    def get_node(self, path):
 
        """
 
        Returns node from within this particular ``DirNode``, so it is now
 
        allowed to fetch, i.e. node located at 'docs/api/index.rst' from node
 
        'docs'. In order to access deeper nodes one must fetch nodes between
 
        them first - this would work::
 

	
 
           docs = root.get_node('docs')
 
           docs.get_node('api').get_node('index.rst')
 

	
 
        :param: path - relative to the current node
 

	
 
        .. note::
 
           To access lazily (as in example above) node have to be initialized
 
           with related changeset object - without it node is out of
 
           context and may know nothing about anything else than nearest
 
           (located at same level) nodes.
 
        """
 
        try:
 
            path = path.rstrip('/')
 
            if path == '':
 
                raise NodeError("Cannot retrieve node without path")
 
            self.nodes  # access nodes first in order to set _nodes_dict
 
            paths = path.split('/')
 
            if len(paths) == 1:
 
                if not self.is_root():
 
                    path = '/'.join((self.path, paths[0]))
 
                else:
 
                    path = paths[0]
 
                return self._nodes_dict[path]
 
            elif len(paths) > 1:
 
                if self.changeset is None:
 
                    raise NodeError("Cannot access deeper "
 
                                    "nodes without changeset")
 
                else:
 
                    path1, path2 = paths[0], '/'.join(paths[1:])
 
                    return self.get_node(path1).get_node(path2)
 
            else:
 
                raise KeyError
 
        except KeyError:
 
            raise NodeError("Node does not exist at %s" % path)
 

	
 
    @LazyProperty
 
    def state(self):
 
        raise NodeError("Cannot access state of DirNode")
 

	
 
    @LazyProperty
 
    def size(self):
 
        size = 0
 
        for root, dirs, files in self.changeset.walk(self.path):
 
            for f in files:
 
                size += f.size
 

	
 
        return size
 

	
 
    def __repr__(self):
 
        return '<%s %r @ %s>' % (self.__class__.__name__, self.path,
 
                                 getattr(self.changeset, 'short_id', ''))
 

	
 

	
 
class RootNode(DirNode):
 
    """
 
    DirNode being the root node of the repository.
 
    """
 

	
 
    def __init__(self, nodes=(), changeset=None):
 
        super(RootNode, self).__init__(path='', nodes=nodes,
 
            changeset=changeset)
 

	
 
    def __repr__(self):
 
        return '<%s>' % self.__class__.__name__
 

	
 

	
 
class SubModuleNode(Node):
 
    """
 
    represents a SubModule of Git or SubRepo of Mercurial
 
    """
 
    is_binary = False
 
    size = 0
 

	
 
    def __init__(self, name, url, changeset=None, alias=None):
 
        # Note: Doesn't call Node.__init__!
 
        self.path = name.rstrip('/')
 
        self.kind = NodeKind.SUBMODULE
 
        self.alias = alias
 
        # we have to use emptyChangeset here since this can point to svn/git/hg
 
        # we have to use emptyChangeset here since this can point to git/hg
 
        # submodules we cannot get from repository
 
        self.changeset = EmptyChangeset(changeset, alias=alias)
 
        self.url = url
 

	
 
    def __repr__(self):
 
        return '<%s %r @ %s>' % (self.__class__.__name__, self.path,
 
                                 getattr(self.changeset, 'short_id', ''))
 

	
 
    @LazyProperty
 
    def name(self):
 
        """
 
        Returns name of the node so if its path
 
        then only last part is returned.
 
        """
 
        org = self.path.rstrip('/').rsplit('/', 1)[-1]
 
        return '%s @ %s' % (org, safe_str(self.changeset.short_id))
kallithea/model/db.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program is distributed in the hope that it will be useful,
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
# GNU General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
"""
 
kallithea.model.db
 
~~~~~~~~~~~~~~~~~~
 

	
 
Database Models for Kallithea
 

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

	
 
import base64
 
import collections
 
import datetime
 
import functools
 
import hashlib
 
import logging
 
import os
 
import time
 
import traceback
 

	
 
import ipaddr
 
import sqlalchemy
 
from sqlalchemy import Boolean, Column, DateTime, Float, ForeignKey, Index, Integer, LargeBinary, String, Unicode, UnicodeText, UniqueConstraint
 
from sqlalchemy.ext.hybrid import hybrid_property
 
from sqlalchemy.orm import class_mapper, joinedload, relationship, validates
 
from tg.i18n import lazy_ugettext as _
 
from webob.exc import HTTPNotFound
 

	
 
import kallithea
 
from kallithea.lib import ext_json, ssh
 
from kallithea.lib.exceptions import DefaultUserException
 
from kallithea.lib.utils2 import (asbool, ascii_bytes, aslist, get_changeset_safe, get_clone_url, remove_prefix, safe_bytes, safe_int, safe_str,
 
                                  urlreadable)
 
from kallithea.lib.utils2 import asbool, ascii_bytes, aslist, get_changeset_safe, get_clone_url, remove_prefix, safe_bytes, safe_int, safe_str, urlreadable
 
from kallithea.lib.vcs import get_backend
 
from kallithea.lib.vcs.backends.base import EmptyChangeset
 
from kallithea.lib.vcs.utils.helpers import get_scm
 
from kallithea.model.meta import Base, Session
 

	
 

	
 
URL_SEP = '/'
 
log = logging.getLogger(__name__)
 

	
 
#==============================================================================
 
# BASE CLASSES
 
#==============================================================================
 

	
 
class BaseDbModel(object):
 
    """
 
    Base Model for all classes
 
    """
 

	
 
    @classmethod
 
    def _get_keys(cls):
 
        """return column names for this model """
 
        # Note: not a normal dict - iterator gives "users.firstname", but keys gives "firstname"
 
        return class_mapper(cls).c.keys()
 

	
 
    def get_dict(self):
 
        """
 
        return dict with keys and values corresponding
 
        to this model data """
 

	
 
        d = {}
 
        for k in self._get_keys():
 
            d[k] = getattr(self, k)
 

	
 
        # also use __json__() if present to get additional fields
 
        _json_attr = getattr(self, '__json__', None)
 
        if _json_attr:
 
            # update with attributes from __json__
 
            if callable(_json_attr):
 
                _json_attr = _json_attr()
 
            for k, val in _json_attr.items():
 
                d[k] = val
 
        return d
 

	
 
    def get_appstruct(self):
 
        """return list with keys and values tuples corresponding
 
        to this model data """
 

	
 
        return [
 
            (k, getattr(self, k))
 
            for k in self._get_keys()
 
        ]
 

	
 
    def populate_obj(self, populate_dict):
 
        """populate model with data from given populate_dict"""
 

	
 
        for k in self._get_keys():
 
            if k in populate_dict:
 
                setattr(self, k, populate_dict[k])
 

	
 
    @classmethod
 
    def query(cls):
 
        return Session().query(cls)
 

	
 
    @classmethod
 
    def get(cls, id_):
 
        if id_:
 
            return cls.query().get(id_)
 

	
 
    @classmethod
 
    def guess_instance(cls, value, callback=None):
 
        """Haphazardly attempt to convert `value` to a `cls` instance.
 

	
 
        If `value` is None or already a `cls` instance, return it. If `value`
 
        is a number (or looks like one if you squint just right), assume it's
 
        a database primary key and let SQLAlchemy sort things out. Otherwise,
 
        fall back to resolving it using `callback` (if specified); this could
 
        e.g. be a function that looks up instances by name (though that won't
 
        work if the name begins with a digit). Otherwise, raise Exception.
 
        """
 

	
 
        if value is None:
 
            return None
 
        if isinstance(value, cls):
 
            return value
 
        if isinstance(value, int):
 
            return cls.get(value)
 
        if isinstance(value, str) and value.isdigit():
 
            return cls.get(int(value))
 
        if callback is not None:
 
            return callback(value)
 

	
 
        raise Exception(
 
            'given object must be int, long or Instance of %s '
 
            'got %s, no callback provided' % (cls, type(value))
 
        )
 

	
kallithea/model/forms.py
Show inline comments
 
@@ -295,193 +295,192 @@ def UserGroupPermsForm():
 
    class _UserPermsForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = False
 
        chained_validators = [v.ValidPerms(type_='user_group')]
 
    return _UserPermsForm
 

	
 

	
 
def RepoFieldForm():
 
    class _RepoFieldForm(formencode.Schema):
 
        filter_extra_fields = True
 
        allow_extra_fields = True
 

	
 
        new_field_key = All(v.FieldKey(),
 
                            v.UnicodeString(strip=True, min=3, not_empty=True))
 
        new_field_value = v.UnicodeString(not_empty=False, if_missing='')
 
        new_field_type = v.OneOf(['str', 'unicode', 'list', 'tuple'],
 
                                 if_missing='str')
 
        new_field_label = v.UnicodeString(not_empty=False)
 
        new_field_desc = v.UnicodeString(not_empty=False)
 

	
 
    return _RepoFieldForm
 

	
 

	
 
def RepoForkForm(edit=False, old_data=None, supported_backends=BACKENDS,
 
                 repo_groups=None, landing_revs=None):
 
    old_data = old_data or {}
 
    repo_groups = repo_groups or []
 
    landing_revs = landing_revs or []
 
    repo_group_ids = [rg[0] for rg in repo_groups]
 

	
 
    class _RepoForkForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = False
 
        repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True),
 
                        v.SlugifyName())
 
        repo_group = All(v.CanWriteGroup(),
 
                         v.OneOf(repo_group_ids, hideList=True),
 
                         v.Int(min=-1, not_empty=True))
 
        repo_type = All(v.ValidForkType(old_data), v.OneOf(supported_backends))
 
        description = v.UnicodeString(strip=True, min=1, not_empty=True)
 
        private = v.StringBoolean(if_missing=False)
 
        copy_permissions = v.StringBoolean(if_missing=False)
 
        update_after_clone = v.StringBoolean(if_missing=False)
 
        fork_parent_id = v.UnicodeString()
 
        chained_validators = [v.ValidForkName(edit, old_data)]
 
        landing_rev = v.OneOf(landing_revs, hideList=True)
 

	
 
    return _RepoForkForm
 

	
 

	
 
def ApplicationSettingsForm():
 
    class _ApplicationSettingsForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = False
 
        title = v.UnicodeString(strip=True, not_empty=False)
 
        realm = v.UnicodeString(strip=True, min=1, not_empty=True)
 
        ga_code = v.UnicodeString(strip=True, min=1, not_empty=False)
 
        captcha_public_key = v.UnicodeString(strip=True, min=1, not_empty=False)
 
        captcha_private_key = v.UnicodeString(strip=True, min=1, not_empty=False)
 

	
 
    return _ApplicationSettingsForm
 

	
 

	
 
def ApplicationVisualisationForm():
 
    class _ApplicationVisualisationForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = False
 
        show_public_icon = v.StringBoolean(if_missing=False)
 
        show_private_icon = v.StringBoolean(if_missing=False)
 
        stylify_metalabels = v.StringBoolean(if_missing=False)
 

	
 
        repository_fields = v.StringBoolean(if_missing=False)
 
        lightweight_journal = v.StringBoolean(if_missing=False)
 
        dashboard_items = v.Int(min=5, not_empty=True)
 
        admin_grid_items = v.Int(min=5, not_empty=True)
 
        show_version = v.StringBoolean(if_missing=False)
 
        use_gravatar = v.StringBoolean(if_missing=False)
 
        gravatar_url = v.UnicodeString(min=3)
 
        clone_uri_tmpl = v.UnicodeString(min=3)
 
        clone_ssh_tmpl = v.UnicodeString()
 

	
 
    return _ApplicationVisualisationForm
 

	
 

	
 
def ApplicationUiSettingsForm():
 
    class _ApplicationUiSettingsForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = False
 
        paths_root_path = All(
 
            v.ValidPath(),
 
            v.UnicodeString(strip=True, min=1, not_empty=True)
 
        )
 
        hooks_changegroup_update = v.StringBoolean(if_missing=False)
 
        hooks_changegroup_repo_size = v.StringBoolean(if_missing=False)
 

	
 
        extensions_largefiles = v.StringBoolean(if_missing=False)
 
        extensions_hgsubversion = v.StringBoolean(if_missing=False)
 
        extensions_hggit = v.StringBoolean(if_missing=False)
 

	
 
    return _ApplicationUiSettingsForm
 

	
 

	
 
def DefaultPermissionsForm(repo_perms_choices, group_perms_choices,
 
                           user_group_perms_choices, create_choices,
 
                           user_group_create_choices, fork_choices,
 
                           register_choices, extern_activate_choices):
 
    class _DefaultPermissionsForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = True
 
        overwrite_default_repo = v.StringBoolean(if_missing=False)
 
        overwrite_default_group = v.StringBoolean(if_missing=False)
 
        overwrite_default_user_group = v.StringBoolean(if_missing=False)
 
        anonymous = v.StringBoolean(if_missing=False)
 
        default_repo_perm = v.OneOf(repo_perms_choices)
 
        default_group_perm = v.OneOf(group_perms_choices)
 
        default_user_group_perm = v.OneOf(user_group_perms_choices)
 

	
 
        default_repo_create = v.OneOf(create_choices)
 
        default_user_group_create = v.OneOf(user_group_create_choices)
 
        default_fork = v.OneOf(fork_choices)
 

	
 
        default_register = v.OneOf(register_choices)
 
        default_extern_activate = v.OneOf(extern_activate_choices)
 
    return _DefaultPermissionsForm
 

	
 

	
 
def CustomDefaultPermissionsForm():
 
    class _CustomDefaultPermissionsForm(formencode.Schema):
 
        filter_extra_fields = True
 
        allow_extra_fields = True
 

	
 
        create_repo_perm = v.StringBoolean(if_missing=False)
 
        create_user_group_perm = v.StringBoolean(if_missing=False)
 
        #create_repo_group_perm Impl. later
 

	
 
        fork_repo_perm = v.StringBoolean(if_missing=False)
 

	
 
    return _CustomDefaultPermissionsForm
 

	
 

	
 
def DefaultsForm(edit=False, old_data=None, supported_backends=BACKENDS):
 
    class _DefaultsForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = True
 
        default_repo_type = v.OneOf(supported_backends)
 
        default_repo_private = v.StringBoolean(if_missing=False)
 
        default_repo_enable_statistics = v.StringBoolean(if_missing=False)
 
        default_repo_enable_downloads = v.StringBoolean(if_missing=False)
 

	
 
    return _DefaultsForm
 

	
 

	
 
def AuthSettingsForm(current_active_modules):
 
    class _AuthSettingsForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = True
 
        auth_plugins = All(v.ValidAuthPlugins(),
 
                           v.UniqueListFromString()(not_empty=True))
 

	
 
        def __init__(self, *args, **kwargs):
 
            # The auth plugins tell us what form validators they use
 
            if current_active_modules:
 
                import kallithea.lib.auth_modules
 
                from kallithea.lib.auth_modules import LazyFormencode
 
                for module in current_active_modules:
 
                    plugin = kallithea.lib.auth_modules.loadplugin(module)
 
                    plugin_name = plugin.name
 
                    for sv in plugin.plugin_settings():
 
                        newk = "auth_%s_%s" % (plugin_name, sv["name"])
 
                        # can be a LazyFormencode object from plugin settings
 
                        validator = sv["validator"]
 
                        if isinstance(validator, LazyFormencode):
 
                            validator = validator()
 
                        # init all lazy validators from formencode.All
 
                        if isinstance(validator, All):
 
                            init_validators = []
 
                            for validator in validator.validators:
 
                                if isinstance(validator, LazyFormencode):
 
                                    validator = validator()
 
                                init_validators.append(validator)
 
                            validator.validators = init_validators
 

	
 
                        self.add_field(newk, validator)
 
            formencode.Schema.__init__(self, *args, **kwargs)
 

	
 
    return _AuthSettingsForm
 

	
 

	
 
def LdapSettingsForm(tls_reqcert_choices, search_scope_choices,
 
                     tls_kind_choices):
 
    class _LdapSettingsForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = True

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

0 comments (0 inline, 0 general)