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
 
.. _general:
 

	
 
=======================
 
General Kallithea usage
 
=======================
 

	
 

	
 
Repository deletion
 
-------------------
 

	
 
When an admin or owner deletes a repository, Kallithea does
 
not physically delete said repository from the filesystem, but instead
 
renames it in a special way so that it is not possible to push, clone
 
or access the repository.
 

	
 
There is a special command for cleaning up such archived repositories::
 

	
 
    kallithea-cli repo-purge-deleted -c my.ini --older-than=30d
 

	
 
This command scans for archived repositories that are older than
 
30 days, displays them, and asks if you want to delete them (unless given
 
the ``--no-ask`` flag). If you host a large amount of repositories with
 
forks that are constantly being deleted, it is recommended that you run this
 
command via crontab.
 

	
 
It is worth noting that even if someone is given administrative access to
 
Kallithea and deletes a repository, you can easily restore such an action by
 
renaming the repository directory, removing the ``rm__<date>`` prefix.
 

	
 

	
 
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'),
 
                          category='error')
 

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

	
 
        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_visual(self):
 
        c.active = 'visual'
 
        if request.POST:
 
            application_form = ApplicationVisualisationForm()()
 
            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:
 
                settings = [
 
                    ('show_public_icon', 'show_public_icon', 'bool'),
 
                    ('show_private_icon', 'show_private_icon', 'bool'),
 
                    ('stylify_metalabels', 'stylify_metalabels', 'bool'),
 
                    ('repository_fields', 'repository_fields', 'bool'),
 
                    ('dashboard_items', 'dashboard_items', 'int'),
 
                    ('admin_grid_items', 'admin_grid_items', 'int'),
 
                    ('show_version', 'show_version', 'bool'),
 
                    ('use_gravatar', 'use_gravatar', 'bool'),
 
                    ('gravatar_url', 'gravatar_url', 'unicode'),
 
                    ('clone_uri_tmpl', 'clone_uri_tmpl', 'unicode'),
 
                    ('clone_ssh_tmpl', 'clone_ssh_tmpl', 'unicode'),
 
                ]
 
                for setting, form_key, type_ in settings:
 
                    Setting.create_or_update(setting, form_result[form_key], type_)
 

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

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

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

	
 
        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_email(self):
 
        c.active = 'email'
 
        if request.POST:
 
            test_email = request.POST.get('test_email')
 
            test_email_subj = 'Kallithea test email'
 
            test_body = ('Kallithea Email test, '
 
                               'Kallithea version: %s' % c.kallithea_version)
 
            if not test_email:
 
                h.flash(_('Please enter email address'), category='error')
 
                raise HTTPFound(location=url('admin_settings_email'))
 

	
 
            test_email_txt_body = EmailNotificationModel() \
 
                .get_email_tmpl(EmailNotificationModel.TYPE_DEFAULT,
 
                                'txt', body=test_body)
 
            test_email_html_body = EmailNotificationModel() \
 
                .get_email_tmpl(EmailNotificationModel.TYPE_DEFAULT,
 
                                'html', body=test_body)
 

	
 
            recipients = [test_email] if test_email else None
 

	
 
            tasks.send_email(recipients, test_email_subj,
 
                             test_email_txt_body, test_email_html_body)
 

	
 
            h.flash(_('Send email task created'), category='success')
 
            raise HTTPFound(location=url('admin_settings_email'))
 

	
 
        defaults = Setting.get_app_settings()
kallithea/i18n/be/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -273,391 +273,384 @@ msgstr "1 дзень"
 

	
 
msgid "1 month"
 
msgstr "1 месяц"
 

	
 
msgid "Lifetime"
 
msgstr "Тэрмін"
 

	
 
msgid "Error occurred during gist creation"
 
msgstr "Адбылася памылка падчас стварэння gist-запіса"
 

	
 
msgid "Deleted gist %s"
 
msgstr "Gist-запіс %s выдалены"
 

	
 
msgid "Unmodified"
 
msgstr "Без змен"
 

	
 
msgid "Successfully updated gist content"
 
msgstr "Gist-запіс абноўлены"
 

	
 
msgid "Successfully updated gist data"
 
msgstr "Gist-запіс абноўлены"
 

	
 
msgid "Error occurred during update of gist %s"
 
msgstr "Памылка пры абнаўленні gist-запісу %s"
 

	
 
msgid "You can't edit this user since it's crucial for entire application"
 
msgstr ""
 
"Вы не можаце змяніць дадзеныя гэтага карыстальніка, паколькі ён важны для "
 
"працы ўсёй праграмы"
 

	
 
msgid "Your account was updated successfully"
 
msgstr "Ваш уліковы запіс паспяхова абноўлены"
 

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

	
 
msgid "Error occurred during update of user password"
 
msgstr "Памылка пры абнаўленні пароля"
 

	
 
msgid "Added email %s to user"
 
msgstr "Карыстальніку дададзены e-mail %s"
 

	
 
msgid "An error occurred during email saving"
 
msgstr "Памылка пры захаванні e-mail"
 

	
 
msgid "Removed email from user"
 
msgstr "E-mail карыстальніка выдалены"
 

	
 
msgid "API key successfully created"
 
msgstr "API-ключ паспяхова створаны"
 

	
 
msgid "API key successfully reset"
 
msgstr "API-ключ паспяхова скінуты"
 

	
 
msgid "API key successfully deleted"
 
msgstr "API-ключ паспяхова выдалены"
 

	
 
msgid "Read"
 
msgstr "Чытанне"
 

	
 
msgid "Write"
 
msgstr "Запіс"
 

	
 
msgid "Admin"
 
msgstr "Адміністратар"
 

	
 
msgid "Disabled"
 
msgstr "Адключана"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Дазволена, з ручной актывацыяй уліковага запісу"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Дазволена, з аўтаматычнай актывацыяй уліковага запісу"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Ручная актывацыя вонкавага ўліковага запісу"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Аўтаматычная актывацыя вонкавага ўліковага запісу"
 

	
 
msgid "Enabled"
 
msgstr "Уключана"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Глабальныя прывілеі паспяхова абноўленыя"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "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 "Старонка даступная толькі аўтарызаваным карыстальнікам"
 

	
 
msgid "Repository not found in the filesystem"
 
msgstr "Рэпазітар не знойдзены на файлавай сістэме"
 

	
 
msgid "Changeset for %s %s not found in %s"
 
msgstr "Набор змен для %s %s не знойдзены ў %s"
 

	
 
msgid "Binary file"
 
msgstr "Двайковы файл"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Набор змены апынуўся занадта вялікімі і быў падрэзаны, выкарыстоўвайце "
 
"меню параўнання для паказу выніку параўнання"
 

	
 
msgid "No changes detected"
 
msgstr "Змен не выяўлена"
 

	
 
msgid "Deleted branch: %s"
 
msgstr "Выдаленая галіна: %s"
 

	
 
msgid "Created tag: %s"
 
msgstr "Створаны тэг: %s"
 

	
 
msgid "Changeset %s not found"
 
msgstr "Набор змен %s не знойдзены"
 

	
 
msgid "Show all combined changesets %s->%s"
 
msgstr "Паказаць адрозненні разам %s->%s"
 

	
 
msgid "Compare view"
 
msgstr "Параўнанне"
 

	
 
msgid "and"
 
msgstr "і"
 

	
 
msgid "%s more"
 
msgstr "на %s больш"
 

	
 
msgid "revisions"
 
msgstr "версіі"
 

	
 
msgid "Fork name %s"
 
msgstr "Імя форка %s"
 

	
 
msgid "Pull request %s"
 
msgstr "Pull-запыт %s"
 

	
 
msgid "[deleted] repository"
 
msgstr "[выдалены] рэпазітар"
 

	
 
msgid "[created] repository"
 
msgstr "[створаны] рэпазітар"
 

	
 
msgid "[created] repository as fork"
 
msgstr "[створаны] рэпазітар як форк"
 

	
 
msgid "[forked] repository"
 
msgstr "[форкнуты] рэпазітар"
 

	
 
msgid "[updated] repository"
 
msgstr "[абноўлены] рэпазітар"
 

	
 
msgid "[downloaded] archive from repository"
 
msgstr "[загружаны] архіў з рэпазітара"
 

	
 
msgid "[delete] repository"
 
msgstr "[выдалены] рэпазітар"
 

	
 
msgid "[created] user"
 
msgstr "[створаны] карыстальнік"
 

	
 
msgid "[updated] user"
 
msgstr "[абноўлены] карыстальнік"
 

	
 
msgid "[created] user group"
 
msgstr "[створана] група карыстальнікаў"
 

	
 
msgid "[updated] user group"
 
msgstr "[абноўлена] група карыстальнікаў"
 

	
 
msgid "[commented] on revision in repository"
 
msgstr "[каментар] да рэвізіі ў рэпазітары"
 

	
 
msgid "[commented] on pull request for"
 
msgstr "[каментар] у pull-запыце для"
 

	
 
msgid "[closed] pull request for"
 
msgstr "[зачынены] pull-запыт для"
 

	
 
msgid "[pushed] into"
 
msgstr "[адпраўлена] у"
 

	
 
msgid "[committed via Kallithea] into repository"
 
msgstr "[каміт праз Kallithea] у рэпазітары"
 
@@ -755,391 +748,384 @@ msgstr "%s і %s назад"
 
msgid "just now"
 
msgstr "цяпер"
 

	
 
msgid "on line %s"
 
msgstr "на радку %s"
 

	
 
msgid "[Mention]"
 
msgstr "[Згадванне]"
 

	
 
msgid "top level"
 
msgstr "верхні ўзровень"
 

	
 
msgid "Kallithea Administrator"
 
msgstr "Адміністратар Kallithea"
 

	
 
msgid "Only admins can create repository groups"
 
msgstr "Толькі адміністратары могуць ствараць групы репазітароў"
 

	
 
msgid "Non-admins can create repository groups"
 
msgstr "Неадміністратары могуць ствараць групы репазітароў"
 

	
 
msgid "Only admins can create user groups"
 
msgstr "Толькі адміністратары могуць ствараць групы карыстальнікаў"
 

	
 
msgid "Non-admins can create user groups"
 
msgstr "Неадміністратары могуць ствараць групы карыстальнікаў"
 

	
 
msgid "Only admins can create top level repositories"
 
msgstr "Толькі адміністратары могуць ствараць рэпазітары верхняга ўзроўню"
 

	
 
msgid "Non-admins can create top level repositories"
 
msgstr "Неадміністратары могуць ствараць рэпазітары верхняга ўзроўню"
 

	
 
msgid "Only admins can fork repositories"
 
msgstr "Месцазнаходжанне рэпазітароў"
 

	
 
msgid "Registration disabled"
 
msgstr "Рэгістрацыя адключаная"
 

	
 
msgid "User registration with manual account activation"
 
msgstr "Рэгістрацыя карыстальніка з ручной актывацыяй уліковага запісу"
 

	
 
msgid "User registration with automatic account activation"
 
msgstr "Рэгістрацыя карыстальніка з аўтаматычнай актывацыяй"
 

	
 
msgid "Not reviewed"
 
msgstr "Не прагледжана"
 

	
 
msgid "Under review"
 
msgstr "На разглядзе"
 

	
 
msgid "Approved"
 
msgstr "Ухвалена"
 

	
 
msgid "Please enter a login"
 
msgstr "Калі ласка, увядзіце лагін"
 

	
 
msgid "Enter a value %(min)i characters long or more"
 
msgstr "Увядзіце значэнне даўжынёй не меней %(min)i знакаў"
 

	
 
msgid "Please enter a password"
 
msgstr "Калі ласка, увядзіце пароль"
 

	
 
msgid "Enter %(min)i characters or more"
 
msgstr "Увядзіце не меней %(min)i знакаў"
 

	
 
msgid "Name must not contain only digits"
 
msgstr "Імя не можа ўтрымліваць толькі лічбы"
 

	
 
msgid "New user %(new_username)s registered"
 
msgstr "Новы карыстальнік \"%(new_username)s\" зарэгістраваны"
 

	
 
msgid "Closing"
 
msgstr "Зачынены"
 

	
 
msgid ""
 
"%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
 
msgstr ""
 
"%(user)s просіць вас разгледзець pull request %(pr_nice_id)s: %(pr_title)s"
 

	
 
msgid "latest tip"
 
msgstr "апошняя версія"
 

	
 
msgid "New user registration"
 
msgstr "Рэгістрацыя новага карыстальніка"
 

	
 
msgid ""
 
"You can't remove this user since it is crucial for the entire application"
 
msgstr ""
 
"Вы не можаце выдаліць карыстальніка, паколькі гэта крытычна для працы "
 
"ўсёй праграмы"
 

	
 
msgid ""
 
"User \"%s\" still owns %s repositories and cannot be removed. Switch "
 
"owners or remove those repositories: %s"
 
msgstr ""
 
"Карыстальнік \"%s\" усё яшчэ з'яўляецца ўладальнікам %s рэпазітароў і "
 
"таму не можа быць выдалены. Змяніце ўладальніка ці выдаліце гэтыя "
 
"рэпазітары: %s"
 

	
 
msgid ""
 
"User \"%s\" still owns %s repository groups and cannot be removed. Switch "
 
"owners or remove those repository groups: %s"
 
msgstr ""
 
"Карыстальнік \"%s\" усё яшчэ з'яўляецца ўладальнікам %s груп рэпазітароў "
 
"і таму не можа быць выдалены. Змяніце ўладальніка ці выдаліце гэтая "
 
"групы: %s"
 

	
 
msgid ""
 
"User \"%s\" still owns %s user groups and cannot be removed. Switch "
 
"owners or remove those user groups: %s"
 
msgstr ""
 
"Карыстальнік \"%s\" усё яшчэ з'яўляецца ўладальнікам %s груп "
 
"карыстальнікаў і таму не можа быць выдалены. Змяніце ўладальніка ці "
 
"выдаліце гэтыя групы: %s"
 

	
 
msgid "Password reset link"
 
msgstr "Спасылка скіду пароля"
 

	
 
msgid "Password reset notification"
 
msgstr "Паведамленне пра скіданне пароля"
 

	
 
msgid "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 "Няма акаўнта?"
 

	
 
msgid "Sign In"
 
msgstr "Увайсці"
 

	
 
msgid "Password Reset"
 
msgstr "Скінуць пароль"
 

	
 
msgid "Reset Your Password to %s"
 
msgstr "Забыліся на пароль для %s?"
 

	
 
msgid "Reset Your Password"
 
msgstr "Скінуць Ваш пароль"
 

	
 
msgid "Email Address"
 
msgstr "Паштовы адрас"
 

	
 
msgid "Captcha"
 
msgstr "Капча"
 

	
 
msgid "Send Password Reset Email"
 
msgstr "Паслаць спасылку для скідання пароля"
 

	
 
msgid ""
 
"A password reset link will be sent to the specified email address if it "
 
"is registered in the system."
 
msgstr ""
 
"Спасылка для скіду пароля будзе адпраўленая на адпаведны email-адрас, "
 
"калі ён зарэгістраваны ў сістэме."
 

	
 
msgid "New Password"
 
msgstr "Новы пароль"
 

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

	
 
msgid "Sign Up"
 
msgstr "Рэгістрацыя"
 

	
 
msgid "Sign Up to %s"
 
msgstr "Рэгістрацыя на %s"
 

	
 
msgid "Re-enter password"
 
msgstr "Паўтарыце пароль"
 

	
 
msgid "First Name"
 
msgstr "Імя"
 

	
 
msgid "Last Name"
 
msgstr "Прозвішча"
 

	
 
msgid "Email"
 
msgstr "E-mail"
 

	
 
msgid "Please wait for an administrator to activate your account."
 
msgstr ""
 
"Калі ласка, пачакайце, пакуль адміністратар пацвердзіць Вашу рэгістрацыю."
 

	
 
msgid "Admin Journal"
 
msgstr "Журнал адміністратара"
 

	
 
msgid "journal filter..."
 
msgstr "Фільтр журнала..."
 

	
 
msgid "Filter"
 
msgstr "Адфільтраваць"
 

	
 
msgid "%s Entry"
 
msgid_plural "%s Entries"
 
msgstr[0] "%s запіс"
 
msgstr[1] "%s запісаў"
 
msgstr[2] "%s запісы"
 

	
 
msgid "Action"
 
msgstr "Дзеянне"
 

	
 
msgid "Date"
 
msgstr "Дата"
 

	
 
msgid "From IP"
 
msgstr "З IP"
 

	
 
msgid "No actions yet"
 
msgstr "Няма інфармацыі"
 

	
 
msgid "Authentication Settings"
 
msgstr "Налады аўтэнтыфікацыі"
 

	
 
msgid "Authentication"
 
msgstr "Аўтэнтыфікацыя"
 

	
 
msgid "Authentication Plugins"
 
msgstr "Плагіны аўтэнтыфікацыі"
 

	
 
msgid "Enabled Plugins"
 
msgstr "Уключаныя плагіны"
 

	
 
@@ -1486,387 +1472,384 @@ msgstr "Стварэнне рэпазітара"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "Key"
 
msgstr "Ключ"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "State"
 
msgstr "Стан"
 

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

	
 
msgid "Hooks"
 
msgstr "Хукі"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "Follow"
 
msgstr "Назіраць"
 

	
 
msgid "Unfollow"
 
msgstr "Не назіраць"
 

	
 
msgid "Fork"
 
msgstr "Форк"
 

	
 
msgid "Create Pull Request"
 
msgstr "Стварыць pull-запыт"
 

	
 
msgid "Switch To"
 
msgstr "Пераключыцца на"
 

	
 
msgid "No matches found"
 
msgstr "Супадзенняў не знойдзена"
 

	
 
msgid "Show recent activity"
 
msgstr "Паказаць апошнюю актыўнасць"
 

	
 
msgid "Public journal"
 
msgstr "Агульнадаступны журнал"
 

	
 
msgid "Show public gists"
 
msgstr "Паказаць публічныя запісы"
 

	
 
msgid "Gists"
 
msgstr "Gist"
 

	
 
msgid "All Public Gists"
 
msgstr "Усе публічныя Gist-запісы"
 

	
 
msgid "My Public Gists"
 
msgstr "Мае публічныя Gist-запісы"
 

	
 
msgid "My Private Gists"
 
msgstr "Мае прыватныя Gist-запісы"
 

	
 
msgid "Search in repositories"
kallithea/i18n/da/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -306,391 +306,384 @@ msgid "Lifetime"
 
msgstr "Levetid"
 

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

	
 
msgid "Deleted gist %s"
 
msgstr "Slettet gist %s"
 

	
 
msgid "Unmodified"
 
msgstr "Uændret"
 

	
 
msgid "Successfully updated gist content"
 
msgstr "Opdateret gist-indhold successfuldt"
 

	
 
msgid "Successfully updated gist data"
 
msgstr "Opdateret gist-data successfuldt"
 

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

	
 
msgid "You can't edit this user since it's crucial for entire application"
 
msgstr ""
 
"Du kan ikke redigere denne bruger, da den er afgørende for hele "
 
"applikationen"
 

	
 
msgid "Your account was updated successfully"
 
msgstr "Din konto er blevet opdateret successfuldt"
 

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

	
 
msgid "Error occurred during update of user password"
 
msgstr "Der opstod en fejl under opdatering af bruger adgangskode"
 

	
 
msgid "Added email %s to user"
 
msgstr "Tilføjet email %s til bruger"
 

	
 
msgid "An error occurred during email saving"
 
msgstr "Der opstod en fejl under tilføjelse af email"
 

	
 
msgid "Removed email from user"
 
msgstr "Fjernet email fra brugeren"
 

	
 
msgid "API key successfully created"
 
msgstr "API-nøgle oprettet successfuldt"
 

	
 
msgid "API key successfully reset"
 
msgstr "API-nøgle nulstillet successfuldt"
 

	
 
msgid "API key successfully deleted"
 
msgstr "API-nøgle slettet successfuldt"
 

	
 
msgid "Read"
 
msgstr "Læs"
 

	
 
msgid "Write"
 
msgstr "Skriv"
 

	
 
msgid "Admin"
 
msgstr "Admin"
 

	
 
msgid "Disabled"
 
msgstr "Deaktiveret"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Tilladt med manuel kontoaktivering"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Tilladt med automatisk kontoaktivering"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Manuel aktivering af ekstern konto"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Automatisk aktivering af ekstern konto"
 

	
 
msgid "Enabled"
 
msgstr "Aktiveret"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Globale tilladelser opdateret"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Der opstod en fejl under opdatering af tilladelser"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "Nothing"
 
msgstr "Intet"
 

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

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

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

	
 
msgid ""
 
"CSRF token leak has been detected - all form tokens have been expired"
 
msgstr "CSRF-token lækage opdaget, alle form-tokens er invalideret"
 

	
 
msgid "Repository not found in the filesystem"
 
msgstr "Repository ikke fundet i filsystemet"
 

	
 
msgid "Changeset for %s %s not found in %s"
 
msgstr "Changeset for %s %s ikke fundet i %s"
 

	
 
msgid "Binary file"
 
msgstr "Binær fil"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Changeset var for stor, og blev afskåret, brug diff menu for at få vist "
 
"denne diff"
 

	
 
msgid "No changes detected"
 
msgstr "Ingen ændringer fundet"
 

	
 
msgid "Deleted branch: %s"
 
msgstr "Slettet branch: %s"
 

	
 
msgid "Created tag: %s"
 
msgstr "Oprettet tag: %s"
 

	
 
msgid "Changeset %s not found"
 
msgstr "Changeset %s ikke fundet"
 

	
 
msgid "Show all combined changesets %s->%s"
 
msgstr "Vis alle kombineret changesets %s->%s"
 

	
 
msgid "Compare view"
 
msgstr "Sammenlign visning"
 

	
 
msgid "and"
 
msgstr "og"
 

	
 
msgid "%s more"
 
msgstr "%s flere"
 

	
 
msgid "revisions"
 
msgstr "revisioner"
 

	
 
msgid "Fork name %s"
 
msgstr "Fork-navn %s"
 

	
 
msgid "Pull request %s"
 
msgstr "Pull-forespørgsel %s"
 

	
 
msgid "[deleted] repository"
 
msgstr "[slettet] repository"
 

	
 
msgid "[created] repository"
 
msgstr "[oprettet] repository"
 

	
 
msgid "[created] repository as fork"
 
msgstr "[oprettet] repository som fork"
 

	
 
msgid "[forked] repository"
 
msgstr "[forked] repository"
 

	
 
msgid "[updated] repository"
 
msgstr "[opdateret] repository"
 

	
 
msgid "[downloaded] archive from repository"
 
msgstr "[hentet] arkiv fra repository"
 

	
 
msgid "[delete] repository"
 
msgstr "[slettet] repository"
 

	
 
msgid "[created] user"
 
msgstr "[oprettet] bruger"
 

	
 
msgid "[updated] user"
 
msgstr "[opdateret] bruger"
 

	
 
msgid "[created] user group"
 
msgstr "[oprettet] brugergruppe"
 

	
 
msgid "[updated] user group"
 
msgstr "[opdateret] brugergruppe"
 

	
 
msgid "[commented] on revision in repository"
 
msgstr "[kommenterede] på revision i repository"
 

	
 
msgid "[commented] on pull request for"
 
msgstr "[kommenterede] på pull-forespørgsel for"
 

	
 
msgid "[closed] pull request for"
 
msgstr "[lukket] pull-forespørgsel for"
 

	
 
msgid "[pushed] into"
 
msgstr "[pushed] ind i"
kallithea/i18n/de/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -297,391 +297,384 @@ msgstr "Lebenszeit"
 
msgid "Error occurred during gist creation"
 
msgstr "Ein fehler trat auf bei der Erstellung des gist"
 

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

	
 
msgid "Unmodified"
 
msgstr "Ungeändert"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "Read"
 
msgstr "Lesen"
 

	
 
msgid "Write"
 
msgstr "Schreiben"
 

	
 
msgid "Admin"
 
msgstr "Admin"
 

	
 
msgid "Disabled"
 
msgstr "Deaktiviert"
 

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

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

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

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

	
 
msgid "Enabled"
 
msgstr "Aktiviert"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "Repository permissions updated"
 
msgstr "Repositoriumsberechtigungen aktualisiert"
 

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

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

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

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

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

	
 
msgid "Nothing"
 
msgstr "Nichts"
 

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

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

	
 
msgid "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"
 
msgstr "Die IP-Adresse %s wurde zur Nutzerwhitelist hinzugefügt"
 

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

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

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

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

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

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

	
 
msgid "Binary file"
 
msgstr "Binäre Datei"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Der Änderungssatz war zu groß und wurde abgeschnitten, benutzen sie das "
 
"Diff Menü um die Unterschiede anzuzeigen"
 

	
 
msgid "No changes detected"
 
msgstr "Keine Änderungen erkannt"
 

	
 
msgid "Deleted branch: %s"
 
msgstr "Branch %s gelöscht"
 

	
 
msgid "Created tag: %s"
 
msgstr "Tag %s erstellt"
 

	
 
msgid "Show all combined changesets %s->%s"
 
msgstr "Zeige alle Kombinierten Änderungensätze %s->%s"
 

	
 
msgid "Compare view"
 
msgstr "Vergleichsansicht"
 

	
 
msgid "and"
 
msgstr "und"
 

	
 
msgid "%s more"
 
msgstr "%s mehr"
 

	
 
msgid "revisions"
 
msgstr "revisionen"
 

	
 
msgid "Fork name %s"
 
msgstr "Fork Name %s"
 

	
 
msgid "Pull request %s"
 
msgstr "Pull Request %s"
 

	
 
msgid "[deleted] repository"
 
msgstr "[gelöscht] Repository"
 

	
 
msgid "[created] repository"
 
msgstr "[erstellt] Repository"
 

	
 
msgid "[created] repository as fork"
 
msgstr "[erstellt] Repository als Fork"
 

	
 
msgid "[forked] repository"
 
msgstr "[forked] Repository"
 

	
 
msgid "[updated] repository"
 
msgstr "[aktualisiert] Repository"
 

	
 
msgid "[downloaded] archive from repository"
 
msgstr "Archiv von Repository [heruntergeladen]"
 

	
 
msgid "[delete] repository"
 
msgstr "Repository [gelöscht]"
 

	
 
msgid "[created] user"
 
msgstr "Benutzer [erstellt]"
 

	
 
msgid "[updated] user"
 
msgstr "Benutzer [akutalisiert]"
 

	
 
msgid "[created] user group"
 
msgstr "Benutzergruppe [erstellt]"
 

	
 
msgid "[updated] user group"
 
msgstr "Benutzergruppe [aktualisiert]"
 

	
 
msgid "[commented] on revision in repository"
 
@@ -832,391 +825,384 @@ msgstr "Der Standard-Benutzer hat Lesere
 
msgid "Default user has write access to new user groups"
 
msgstr "Der Standard-Benutzer hat Schreibrechte auf neuen Benutzer-Gruppen"
 

	
 
msgid "Default user has admin access to new user groups"
 
msgstr "Der Standard-Benutzer hat Admin-Rechte auf neuen Benutzer-Gruppen"
 

	
 
msgid "Only admins can create repository groups"
 
msgstr "Nur Admins können Repository-Gruppen erstellen"
 

	
 
msgid "Non-admins can create repository groups"
 
msgstr "Nicht-Admins können Repository-Gruppen erstellen"
 

	
 
msgid "Only admins can create user groups"
 
msgstr "Nur Admins können Benutzer-Gruppen erstellen"
 

	
 
msgid "Non-admins can create user groups"
 
msgstr "Nicht-Admins können Benutzer-Gruppen erstellen"
 

	
 
msgid "Only admins can create top level repositories"
 
msgstr "Nur Admins können Repositories auf oberster Ebene erstellen"
 

	
 
msgid "Non-admins can create top level repositories"
 
msgstr "Nicht-Admins können Repositories oberster Ebene erstellen"
 

	
 
msgid ""
 
"Repository creation enabled with write permission to a repository group"
 
msgstr ""
 
"Erstellung von Repositories mit Schreibzugriff für Repositorygruppe "
 
"aktiviert"
 

	
 
msgid ""
 
"Repository creation disabled with write permission to a repository group"
 
msgstr ""
 
"Erstellung von Repositories mit Schreibzugriff für Repositorygruppe "
 
"deaktiviert"
 

	
 
msgid "Only admins can fork repositories"
 
msgstr "Nur Admins können Repositories forken"
 

	
 
msgid "Non-admins can fork repositories"
 
msgstr "Nicht-Admins können Repositorys forken"
 

	
 
msgid "Registration disabled"
 
msgstr "Registrierung deaktiviert"
 

	
 
msgid "User registration with manual account activation"
 
msgstr "Benutzerregistrierung mit manueller Kontoaktivierung"
 

	
 
msgid "User registration with automatic account activation"
 
msgstr "Benutzerregistrierung mit automatischer Kontoaktivierung"
 

	
 
msgid "Not reviewed"
 
msgstr "Nicht Begutachtet"
 

	
 
msgid "Under review"
 
msgstr "In Begutachtung"
 

	
 
msgid "Approved"
 
msgstr "Akzeptiert"
 

	
 
msgid "Please enter a login"
 
msgstr "Bitte einen Benutzernamen eingeben"
 

	
 
msgid "Enter a value %(min)i characters long or more"
 
msgstr "Bitte einen Wert mit mindestens %(min)i Zeichen eingeben"
 

	
 
msgid "Please enter a password"
 
msgstr "Bitte ein Passwort eingeben"
 

	
 
msgid "Enter %(min)i characters or more"
 
msgstr "Bitte mindestens %(min)i Zeichen eingeben"
 

	
 
msgid "Name must not contain only digits"
 
msgstr "Name darf nicht nur Ziffern enthalten"
 

	
 
msgid "New user %(new_username)s registered"
 
msgstr "Neuer Benutzer %(new_username)s registriert"
 

	
 
msgid "Closing"
 
msgstr "Schließen"
 

	
 
msgid ""
 
"Cannot create pull request - criss cross merge detected, please merge a "
 
"later %s revision to %s"
 
msgstr ""
 
"Pull-Request kann nicht erstellt werden - Criss Cross Merge erkannt, "
 
"bitte eine spätere %s-Revision in %s zusammenführen."
 

	
 
msgid "You are not authorized to create the pull request"
 
msgstr "Sie sind nicht berechtigt, den Pull-Request anzulegen."
 

	
 
msgid "Closed, next iteration: %s ."
 
msgstr "Geschlossen, nächste Iteration: %s ."
 

	
 
msgid "latest tip"
 
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"
 
msgstr "Passwort"
 

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

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

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

	
 
msgid "Sign In"
 
msgstr "Einloggen"
 

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

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

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

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

	
 
msgid "Captcha"
 
msgstr "CAPTCHA"
 

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

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

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

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

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

	
 
msgid "Confirm"
 
msgstr "Bestätigen"
 

	
 
msgid "Sign Up"
 
msgstr "Registrieren"
 

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

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

	
 
msgid "First Name"
 
msgstr "Vorname"
 

	
 
msgid "Last Name"
 
msgstr "Nachname"
 

	
 
msgid "Email"
 
msgstr "E-Mail"
 

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

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

	
 
msgid "Admin Journal"
 
msgstr "Admin-Logbuch"
 

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

	
 
msgid "Filter"
 
msgstr "Filter"
 

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

	
 
@@ -1914,395 +1900,384 @@ msgstr "Besitzer des Repositorys ändern."
 
msgid "Processed commits"
 
msgstr "Verarbeitete Commits"
 

	
 
msgid "Processed progress"
 
msgstr "Verarbeiteter Fortschritt"
 

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

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

	
 
msgid "Repositories Administration"
 
msgstr "Repositoryverwaltung"
 

	
 
msgid "State"
 
msgstr "Zustand"
 

	
 
msgid "Settings Administration"
 
msgstr "Einstellungsverwaltung"
 

	
 
msgid "VCS"
 
msgstr "VCS"
 

	
 
msgid "Remap and Rescan"
 
msgstr "Neu zuordnen und neu scannen"
 

	
 
msgid "Visual"
 
msgstr "Visuell"
 

	
 
msgid "Hooks"
 
msgstr "Hooks"
 

	
 
msgid "Full Text Search"
 
msgstr "Volltextsuche"
 

	
 
msgid "System Info"
 
msgstr "Systeminfo"
 

	
 
msgid "Send test email to"
 
msgstr "Test-E-Mail senden an"
 

	
 
msgid "Send"
 
msgstr "Senden"
 

	
 
msgid "Site branding"
 
msgstr "Website-Branding"
 

	
 
msgid "Set a custom title for your Kallithea Service."
 
msgstr ""
 
"Legen Sie einen benutzerdefinierten Titel für Ihren Kallithea-Dienst fest."
 

	
 
msgid "HTTP authentication realm"
 
msgstr "HTTP-Authentifizierungsrealm"
 

	
 
msgid "HTML/JavaScript/CSS customization block"
 
msgstr "HTML/JavaScript/CSS Anpassungsblock"
 

	
 
msgid "ReCaptcha public key"
 
msgstr "ReCaptcha öffentlicher Schlüssel"
 

	
 
msgid "Public key for reCaptcha system."
 
msgstr "Öffentlicher Schlüssel für das reCaptcha-System."
 

	
 
msgid "ReCaptcha private key"
 
msgstr "ReCaptcha privater Schlüssel"
 

	
 
msgid ""
 
"Private key for reCaptcha system. Setting this value will enable captcha "
 
"on registration."
 
msgstr ""
 
"Privater Schlüssel für das reCaptcha-System. Wenn Sie diesen Wert "
 
"einstellen, wird das Captcha bei der Registrierung aktiviert."
 

	
 
msgid "Save Settings"
 
msgstr "Einstellungen speichern"
 

	
 
msgid "Built-in Mercurial Hooks (Read-Only)"
 
msgstr "Eingebaute Mercurial Hooks (Read -Only)"
 

	
 
msgid "Custom Hooks"
 
msgstr "Benutzerdefinierte Hooks"
 

	
 
msgid ""
 
"Hooks can be used to trigger actions on certain events such as push / "
 
"pull. They can trigger Python functions or external applications."
 
msgstr ""
 
"Mit Hilfe von Hooks können bei bestimmten Ereignissen, wie z.B. Push / "
 
"Pull, Aktionen ausgelöst werden. Sie können Python-Funktionen oder "
 
"externe Anwendungen auslösen."
 

	
 
msgid "Failed to remove hook"
 
msgstr "Hook konnte nicht entfernt werden"
 

	
 
msgid "Delete records of missing repositories"
 
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"
 

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

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

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

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

	
 
msgid "User Groups"
 
msgstr "Benutzergruppen"
 

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

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

	
 
msgid "Active"
 
msgstr "Aktiv"
 

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

	
 
msgid "Members"
 
msgstr "Mitglieder"
 

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

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

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

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

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

	
 
msgid "User Groups Administration"
 
msgstr "Benutzergruppenverwaltung"
 

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

	
 
msgid "Users"
 
msgstr "Benutzer"
 

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

	
 
msgid "Password confirmation"
 
msgstr "Passwortbestätigung"
 

	
 
msgid "Emails"
 
msgstr "E-Mails"
 

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

	
 
msgid "Last Login"
 
msgstr "Letzter Login"
 

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

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

	
 
msgid "Users Administration"
 
msgstr "Benutzerverwaltung"
 

	
 
msgid "Auth Type"
 
msgstr "Authentifizierungsart"
 

	
 
msgid "Support"
 
msgstr "Support"
 

	
 
msgid "Mercurial repository"
 
msgstr "Mercurial Repository"
 

	
 
msgid "Git repository"
 
msgstr "Git Repository"
 

	
kallithea/i18n/el/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -351,391 +351,384 @@ msgstr "Mη τροποποιημένo"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Συνέβηκε κάποιο λάθος κατά την δημιουργία της ομάδας αποθετηρίου %s"
 

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

	
 
msgid "Updated repository group %s"
 
msgstr "Ενημερώθηκε η ομάδα αποθετηρίου %s"
 

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

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Αυτή η ομάδα περιέχει %s αποθετήρια και δε μπορεί να διαγραφεί"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
msgstr "Αυτή η ομάδα περιέχει %s υποομάδες και δε μπορεί να διαγραφεί"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "and"
 
msgstr "και"
 

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "mod"
 
msgstr "τροποποιημένο"
 
@@ -942,391 +935,384 @@ msgstr "Εγκρίθηκε"
 
msgid "Please enter a login"
 
msgstr "Παρακαλώ εισάγετε ένα όνομα χρήστη"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "Captcha"
 
msgstr "Captcha"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "journal filter..."
 
msgstr "φίλτρο εγγραφών..."
 
@@ -2071,395 +2057,384 @@ msgstr ""
 

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

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

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

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

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

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

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

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

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

	
 
msgid "VCS"
 
msgstr "VCS"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "Show repository size after push"
 
msgstr "Εμφάνιση μεγέθους αποθετηρίου μετά την ώθηση"
 

	
 
msgid "Update repository after push (hg update)"
 
msgstr "Ενημέρωση αποθετηρίου μετά την ώθηση (hg update)"
 

	
 
msgid "Mercurial extensions"
 
msgstr "Επεκτάσεις Mercurial"
 

	
 
msgid "Enable largefiles extension"
 
msgstr "Ενεργοποίηση επέκτασης μεγάλων αρχείων"
 

	
 
msgid "Enable hgsubversion extension"
 
msgstr "Ενεργοποίηση επέκτασης hgsubversion"
 

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

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

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

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

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

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

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

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

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

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

	
 
msgid ""
 
"Gravatar URL allows you to use another avatar server application.\n"
 
"                                                        The following "
 
"variables of the URL will be replaced accordingly.\n"
 
"                                                        {scheme}    "
 
"'http' or 'https' sent from running Kallithea server,\n"
 
"                                                        {email}     user "
 
"email,\n"
 
"                                                        {md5email}  md5 "
 
"hash of the user email (like at gravatar.com),\n"
 
"                                                        {size}      size "
 
"of the image that is expected from the server application,\n"
 
"                                                        {netloc}    "
 
"network location/server host of running Kallithea server"
 
msgstr ""
 
"Το Gravatar URL σας επιτρέπει να χρησιμοποιήσετε avatar από έναν άλλο "
 
"διακομιστή.\n"
 
"                                                        Οι ακόλουθες "
 
"μεταβλητές της διεύθυνσης URL θα αντικατασταθούν ανάλογα.\n"
 
"                                                        {scheme} 'http' ή "
 
"'https' που αποστέλλεται από την εκτέλεση του διακομιστή της Καλλιθέας,\n"
 
"                                                        {email} "
 
"ηλεκτρονικό ταχυδρομείο,\n"
 
"                                                        {md5email} md5 "
 
"hash του email χρήστη (όπως στο gravatar.com),\n"
 
"                                                        {size} μέγεθος "
 
"της εικόνας που αναμένεται από το διακομιστή,\n"
 
"                                                        {netloc} θέση "
 
"δικτύου/διακομιστή που τρέχει την Καλλιθέα"
 

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

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

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

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

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

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

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

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

	
 
msgid "Icons"
 
msgstr "Εικονίδια"
 

	
 
msgid "Show public repository icon on repositories"
 
msgstr "Εμφάνιση δημόσιου εικονιδίου αποθετηρίου στα αποθετήρια"
 

	
 
msgid "Show private repository icon on repositories"
 
msgstr "Εμφάνιση εικονιδίου ιδιωτικού αποθετηρίου στα αποθετήρια"
 

	
 
msgid "Show public/private icons next to repository names."
 
msgstr ""
 
"Εμφάνιση δημόσιων/ιδιωτικών εικονιδίων δίπλα στα ονόματα αποθετηρίων."
 

	
 
msgid "Meta Tagging"
 
msgstr "Μεταετικέτες"
 

	
 
msgid ""
 
"Parses meta tags from the repository description field and turns them "
 
"into colored tags."
 
msgstr ""
 
"Αναλύει τις μετα-ετικέτες από το πεδίο περιγραφής του αποθετηρίου και τις "
 
"μετατρέπει σε έγχρωμες ετικέτες."
 

	
 
msgid "Add user group"
 
msgstr "Προσθήκη ομάδας χρηστών"
 

	
 
msgid "User Groups"
 
msgstr "Ομάδες Χρηστών"
 

	
 
msgid "Add User Group"
 
msgstr "Προσθήκη Ομάδας Χρηστών"
 

	
 
msgid "Short, optional description for this user group."
 
msgstr "Σύντομη, προαιρετική περιγραφή για αυτήν την ομάδα χρηστών."
 

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

	
 
msgid "%s user group settings"
 
msgstr "Ρυθμίσεις ομάδας χρηστών %s"
 

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

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

	
 
msgid "Members"
kallithea/i18n/fr/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -360,391 +360,384 @@ msgstr "Le contenu du gist a été mis à jour avec succès"
 
msgid "Successfully updated gist data"
 
msgstr "Les données du gist on été mises à jour avec succès"
 

	
 
msgid "Error occurred during update of gist %s"
 
msgstr "Une erreur est survenue durant la mise à jour du gist %s"
 

	
 
msgid "You can't edit this user since it's crucial for entire application"
 
msgstr ""
 
"Vous ne pouvez pas éditer cet utilisateur ; il est nécessaire pour le bon "
 
"fonctionnement de l’application"
 

	
 
msgid "Your account was updated successfully"
 
msgstr "Votre compte a été mis à jour avec succès"
 

	
 
msgid "Error occurred during update of user %s"
 
msgstr "Une erreur est survenue durant la mise à jour de l'utilisateur %s"
 

	
 
msgid "Error occurred during update of user password"
 
msgstr ""
 
"Une erreur est survenue durant la mise à jour du mot de passe de "
 
"l'utilisateur"
 

	
 
msgid "Added email %s to user"
 
msgstr "L’e-mail « %s » a été ajouté à l’utilisateur"
 

	
 
msgid "An error occurred during email saving"
 
msgstr "Une erreur est survenue durant l’enregistrement de l’e-mail"
 

	
 
msgid "Removed email from user"
 
msgstr "L’e-mail a été enlevé de l’utilisateur"
 

	
 
msgid "API key successfully created"
 
msgstr "Clé d'API créée avec succès"
 

	
 
msgid "API key successfully reset"
 
msgstr "Clé d'API remise à zéro avec succès"
 

	
 
msgid "API key successfully deleted"
 
msgstr "Clé d'API supprimée avec succès"
 

	
 
msgid "SSH key %s successfully added"
 
msgstr "Clé SSH %s ajoutée avec succès"
 

	
 
msgid "SSH key successfully deleted"
 
msgstr "Clé SSH supprimée avec succès"
 

	
 
msgid "Read"
 
msgstr "Lire"
 

	
 
msgid "Write"
 
msgstr "Écrire"
 

	
 
msgid "Admin"
 
msgstr "Administration"
 

	
 
msgid "Disabled"
 
msgstr "Interdite"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Autorisé avec activation de compte manuelle"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Autorisé avec activation de compte automatique"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Activation manuelle du compte externe"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Activation automatique du compte externe"
 

	
 
msgid "Enabled"
 
msgstr "Autorisée"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Permissions globales mises à jour avec succès"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Une erreur est survenue durant la mise à jour des permissions"
 

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

	
 
msgid "Created repository group %s"
 
msgstr "Groupe de dépôts %s créé"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Groupe de dépôts %s mis à jour"
 

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

	
 
msgid "This group contains %s repositories and cannot be deleted"
 
msgstr "Ce groupe contient %s dépôts et ne peut être supprimé"
 

	
 
msgid "This group contains %s subgroups and cannot be deleted"
 
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"
 

	
 
msgid "The default user cannot be edited"
 
msgstr "L'utilisateur par défaut ne peut pas être modifié"
 

	
 
msgid "Added IP address %s to user whitelist"
 
msgstr "L'adresse IP %s a été ajoutée à la liste blanche"
 

	
 
msgid "An error occurred while adding IP address"
 
msgstr "Une erreur est survenue durant la sauvegarde d'IP"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "L'adresse IP a été supprimée de la liste blanche"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr ""
 
"Vous devez être un utilisateur enregistré pour effectuer cette action"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Vous devez être connecté pour visualiser cette page"
 

	
 
msgid ""
 
"CSRF token leak has been detected - all form tokens have been expired"
 
msgstr ""
 
"Une fuite de jeton CSRF a été détectée - tous les jetons de formulaire "
 
"sont considérés comme expirés"
 

	
 
msgid "Repository not found in the filesystem"
 
msgstr "Dépôt non trouvé sur le système de fichiers"
 

	
 
msgid "Changeset for %s %s not found in %s"
 
msgstr "Ensemble de changements pour %s %s non trouvé dans %s"
 

	
 
msgid "SSH access is disabled."
 
msgstr "L'accès SSH est désactivé."
 

	
 
msgid "Binary file"
 
msgstr "Fichier binaire"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Cet ensemble de changements était trop gros pour être affiché et a été "
 
"découpé, utilisez le menu « diff » pour afficher les différences"
 

	
 
msgid "No changes detected"
 
msgstr "Aucun changement détecté"
 

	
 
msgid "Deleted branch: %s"
 
msgstr "Branche supprimée : %s"
 

	
 
msgid "Created tag: %s"
 
msgstr "Étiquette créée : %s"
 

	
 
msgid "Changeset %s not found"
 
msgstr "Ensemble de changements %s non trouvé"
 

	
 
msgid "Show all combined changesets %s->%s"
 
msgstr "Afficher les changements combinés %s->%s"
 

	
 
msgid "Compare view"
 
msgstr "Vue de comparaison"
 

	
 
msgid "and"
 
msgstr "et"
 

	
 
msgid "%s more"
 
msgstr "%s de plus"
 

	
 
msgid "revisions"
 
msgstr "révisions"
 

	
 
msgid "Fork name %s"
 
msgstr "Nom du fork %s"
 

	
 
msgid "Pull request %s"
 
msgstr "Requête de pull %s"
 

	
 
msgid "[deleted] repository"
 
msgstr "[a supprimé] le dépôt"
 

	
 
msgid "[created] repository"
 
msgstr "[a créé] le dépôt"
 

	
 
msgid "[created] repository as fork"
 
msgstr "[a créé] le dépôt en tant que fork"
 

	
 
msgid "[forked] repository"
 
msgstr "[a forké] le dépôt"
 

	
 
msgid "[updated] repository"
 
msgstr "[a mis à jour] le dépôt"
 

	
 
msgid "[downloaded] archive from repository"
 
msgstr "[téléchargée] archive depuis le dépôt"
 

	
 
msgid "[delete] repository"
 
msgstr "[a supprimé] le dépôt"
 
@@ -1038,391 +1031,384 @@ msgstr ""
 
"%(repo_name)s dans %(branch)s"
 

	
 
msgid "New user %(new_username)s registered"
 
msgstr "Nouvel utilisateur %(new_username)s enregistré"
 

	
 
msgid ""
 
"[Review] %(repo_name)s PR %(pr_nice_id)s \"%(pr_title_short)s\" from "
 
"%(pr_source_branch)s by %(pr_owner_username)s"
 
msgstr ""
 
"[Revue] %(repo_name)s PR %(pr_nice_id)s « %(pr_title_short)s » depuis "
 
"%(pr_source_branch)s par %(pr_owner_username)s"
 

	
 
msgid ""
 
"[Comment] %(repo_name)s PR %(pr_nice_id)s \"%(pr_title_short)s\" from "
 
"%(pr_source_branch)s by %(pr_owner_username)s"
 
msgstr ""
 
"[Commentaire] %(repo_name)s PR %(pr_nice_id)s « %(pr_title_short)s » "
 
"depuis %(pr_source_branch)s par %(pr_owner_username)s"
 

	
 
msgid "Closing"
 
msgstr "Fermeture"
 

	
 
msgid ""
 
"%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
 
msgstr ""
 
"%(user)s veut que vous regardiez la demande de pull %(pr_nice_id)s : "
 
"%(pr_title)s"
 

	
 
msgid "Cannot create empty pull request"
 
msgstr "Impossible de créer une requête de pull vide"
 

	
 
msgid ""
 
"Cannot create pull request - criss cross merge detected, please merge a "
 
"later %s revision to %s"
 
msgstr ""
 
"Impossible de créer la requête de pull : fusion croisée détectée, merci "
 
"de fusionner une révision plus vieille de %s vers %s"
 

	
 
msgid "You are not authorized to create the pull request"
 
msgstr "Vous n'êtes pas autorisé à créer cette requête de pull"
 

	
 
msgid "Missing changesets since the previous iteration:"
 
msgstr "Changeset manquant depuis la précédente itération :"
 

	
 
msgid "New changesets on %s %s since the previous iteration:"
 
msgstr "Nouveau changeset sur %s %s depuis la précédente itération :"
 

	
 
msgid "Ancestor didn't change - diff since previous iteration:"
 
msgstr "L'ancêtre n'a pas changé - diff depuis l'itération précédente :"
 

	
 
msgid ""
 
"This iteration is based on another %s revision and there is no simple "
 
"diff."
 
msgstr ""
 
"Cette itération est basée sur une autre révision %s et il n'y a pas de "
 
"diff simple."
 

	
 
msgid "No changes found on %s %s since previous iteration."
 
msgstr "Aucun changement constaté sur %s %s depuis l'itération précédente."
 

	
 
msgid "Closed, next iteration: %s ."
 
msgstr "Fermé, itération suivante : %s."
 

	
 
msgid "latest tip"
 
msgstr "Dernier sommet"
 

	
 
msgid "SSH key %r is invalid: %s"
 
msgstr "La clé SSH %r est invalide : %s"
 

	
 
msgid "SSH key %s is already used by %s"
 
msgstr "La clé SSH %s est déjà utilisée par %s"
 

	
 
msgid "SSH key with fingerprint %r found"
 
msgstr "Clé SSH avec l'empreinte %r trouvée"
 

	
 
msgid "New user registration"
 
msgstr "Nouveau enregistrement d'utilisateur"
 

	
 
msgid ""
 
"You can't remove this user since it is crucial for the entire application"
 
msgstr ""
 
"Vous ne pouvez pas supprimer cet utilisateur ; il est nécessaire pour le "
 
"bon fonctionnement de l’application"
 

	
 
msgid ""
 
"User \"%s\" still owns %s repositories and cannot be removed. Switch "
 
"owners or remove those repositories: %s"
 
msgstr ""
 
"L’utilisateur \"%s\" possède %s dépôts et ne peut être supprimé. Changez "
 
"les propriétaires ou supprimez ces dépôts : %s"
 

	
 
msgid ""
 
"User \"%s\" still owns %s repository groups and cannot be removed. Switch "
 
"owners or remove those repository groups: %s"
 
msgstr ""
 
"L’utilisateur \"%s\" possède %s groupes de dépôt et ne peut être "
 
"supprimé. Changez les propriétaires ou supprimez ces dépôts : %s"
 

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

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

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

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

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

	
 
msgid "Username \"%(username)s\" already exists"
 
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"
 

	
 
msgid "Stay logged in after browser restart"
 
msgstr "Rester connecté après un redémarrage du navigateur"
 

	
 
msgid "Forgot your password ?"
 
msgstr "Mot de passe oublié ?"
 

	
 
msgid "Don't have an account ?"
 
msgstr "Vous n’avez pas de compte ?"
 

	
 
msgid "Sign In"
 
msgstr "Connexion"
 

	
 
msgid "Password Reset"
 
msgstr "Remettre le mot de passe à zéro"
 

	
 
msgid "Reset Your Password to %s"
 
msgstr "Réinitialiser votre mot de passe à %s"
 

	
 
msgid "Reset Your Password"
 
msgstr "Réinitialiser votre mot de passe"
 

	
 
msgid "Email Address"
 
msgstr "Adresse e-mail"
 

	
 
msgid "Captcha"
 
msgstr "Captcha"
 

	
 
msgid "Send Password Reset Email"
 
msgstr "Envoyer l'E-mail de réinitialisation du mot de passe"
 

	
 
msgid ""
 
"A password reset link will be sent to the specified email address if it "
 
"is registered in the system."
 
msgstr ""
 
"Un lien de réinitialisation du mot de passe sera envoyé à l'adresse e-"
 
"mail indiquée si elle est enregistrée dans le système."
 

	
 
msgid "You are about to set a new password for the email address %s."
 
msgstr ""
 
"Vous êtes sur le point de changer le mot de passe pour l'adresse e-mail "
 
"%s."
 

	
 
msgid ""
 
"Note that you must use the same browser session for this as the one used "
 
"to request the password reset."
 
msgstr ""
 
"Vous devez utiliser la même session de navigateur pour cette opération "
 
"que celle utilisée pour la demande de réinitialisation de mot de passe."
 

	
 
msgid "Code you received in the email"
 
msgstr "Le code que vous avez reçu dans l'e-mail"
 

	
 
msgid "New Password"
 
msgstr "Nouveau mot de passe"
 

	
 
msgid "Confirm New Password"
 
msgstr "Confirmer le nouveau mot de passe"
 

	
 
msgid "Confirm"
 
msgstr "Confirmation"
 

	
 
msgid "Sign Up"
 
msgstr "Inscription"
 

	
 
msgid "Sign Up to %s"
 
msgstr "S'inscrire sur %s"
 

	
 
msgid "Re-enter password"
 
msgstr "Confirmation"
 

	
 
msgid "First Name"
 
msgstr "Prénom"
 

	
 
msgid "Last Name"
 
msgstr "Nom"
 

	
 
msgid "Email"
 
msgstr "E-mail"
 

	
 
msgid "Registered accounts are ready to use and need no further action."
 
msgstr ""
 
"Les comptes enregistrés sont prêts à être utilisés, et ne nécessitent "
 
"aucune autre action."
 

	
 
msgid "Please wait for an administrator to activate your account."
 
msgstr "Merci d'attendre qu'un administrateur active votre compte."
 

	
 
msgid "Admin Journal"
 
msgstr "Historique d’administration"
 

	
 
msgid "journal filter..."
 
msgstr "filtre du journal…"
 

	
 
msgid "Filter"
 
msgstr "Filtre"
 
@@ -2201,394 +2187,384 @@ msgstr ""
 

	
 
msgid "Repositories Administration"
 
msgstr "Administration des dépôts"
 

	
 
msgid "State"
 
msgstr "État"
 

	
 
msgid "Settings Administration"
 
msgstr "Administration des options"
 

	
 
msgid "VCS"
 
msgstr "VCS"
 

	
 
msgid "Remap and Rescan"
 
msgstr "Mapper et scanner"
 

	
 
msgid "Visual"
 
msgstr "Visuel"
 

	
 
msgid "Hooks"
 
msgstr "Hooks"
 

	
 
msgid "Full Text Search"
 
msgstr "Recherche dans le texte complet"
 

	
 
msgid "System Info"
 
msgstr "Informations sytème"
 

	
 
msgid "Send test email to"
 
msgstr "Envoyer un courriel de test à"
 

	
 
msgid "Send"
 
msgstr "Envoyer"
 

	
 
msgid "Site branding"
 
msgstr "Nom du site"
 

	
 
msgid "Set a custom title for your Kallithea Service."
 
msgstr "Mettez un title personnalisé pour votre service Kallithea."
 

	
 
msgid "HTTP authentication realm"
 
msgstr "Domaine d'authentification HTTP (realm)"
 

	
 
msgid "HTML/JavaScript/CSS customization block"
 
msgstr "Bloc de personnalisation HTML/JavaScript/CSS"
 

	
 
msgid ""
 
"HTML (possibly with                         JavaScript and/or CSS) that "
 
"will be added to the bottom                         of every page. This "
 
"can be used for web analytics                         systems, but also "
 
"to                         perform instance-specific customizations like "
 
"adding a                         project banner at the top of every page."
 
msgstr ""
 
"HTML (potentiellement avec du JavaScript et/ou du CSS) qui sera ajouté en "
 
"bas de chaque page. Cela peut être utilisé pour les systèmes d'analyse de "
 
"trafic Web, mais aussi pour effectuer des personnalisations spécifiques à "
 
"une instance, comme ajouter une bannière de projet en haut de chaque page."
 

	
 
msgid "ReCaptcha public key"
 
msgstr "Clé publique ReCaptcha"
 

	
 
msgid "Public key for reCaptcha system."
 
msgstr "Clé publique pour le système reCaptcha."
 

	
 
msgid "ReCaptcha private key"
 
msgstr "Clé privée ReCaptcha"
 

	
 
msgid ""
 
"Private key for reCaptcha system. Setting this value will enable captcha "
 
"on registration."
 
msgstr ""
 
"Clé privée pour le système reCaptcha. Définir cette valeur activera le "
 
"captcha à l'enregistrement."
 

	
 
msgid "Save Settings"
 
msgstr "Enregistrer les options"
 

	
 
msgid "Built-in Mercurial Hooks (Read-Only)"
 
msgstr "Hooks Mercurial intégrés (lecture seule)"
 

	
 
msgid "Custom Hooks"
 
msgstr "Hooks personnalisés"
 

	
 
msgid ""
 
"Hooks can be used to trigger actions on certain events such as push / "
 
"pull. They can trigger Python functions or external applications."
 
msgstr ""
 
"Les hooks peuvent être utilisés pour déclencher des actions lors de "
 
"certains évènements comme le push et le pull. Ils peuvent déclencher des "
 
"fonctions Python ou des applications externes."
 

	
 
msgid "Failed to remove hook"
 
msgstr "Erreur lors de la suppression du hook"
 

	
 
msgid "Rescan options"
 
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"
 

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

	
 
msgid "Show public/private icons next to repository names."
 
msgstr "Afficher l’icône « public/privé » à côté du nom des dépôts."
 

	
 
msgid "Meta Tagging"
 
msgstr "Meta-tagging"
 

	
 
msgid ""
 
"Parses meta tags from the repository description field and turns them "
 
"into colored tags."
 
msgstr ""
 
"Analyser les méta-tags dans le champ de description du dépôt et les "
 
"transformer en tags colorés."
 

	
 
msgid "Stylify recognised meta tags:"
 
msgstr "Styliser les méta-tags reconnus :"
 

	
 
msgid "Add user group"
 
msgstr "Ajouter un groupe d'utilisateurs"
 

	
 
msgid "User Groups"
 
msgstr "Groupes d'utilisateurs"
 

	
 
msgid "Add User Group"
 
msgstr "Ajouter un groupe d'utilisateurs"
 

	
 
msgid "Short, optional description for this user group."
 
msgstr "Description courte pour ce groupe d'utilisateur (optionnel)."
 

	
 
msgid "Active"
 
msgstr "Actif"
 

	
 
msgid "%s user group settings"
 
msgstr "Réglages du groupe d'utilisateurs %s"
 

	
 
msgid "Show Members"
 
msgstr "Afficher les membres"
 

	
 
msgid "User Group: %s"
 
msgstr "Groupe d'utilisateurs : %s"
 

	
 
msgid "Members"
 
msgstr "Membres"
 

	
 
msgid "Confirm to delete this user group: %s"
 
msgstr "Voulez-vous vraiment supprimer ce groupe utilisateur : %s ?"
 

	
 
msgid "Delete this user group"
 
msgstr "Supprimer ce groupe d'utilisateurs"
 

	
 
msgid "No members yet"
 
msgstr "Aucun membre pour l'instant"
 

	
 
msgid "Chosen group members"
 
msgstr "Membres de groupe sélectionnés"
 

	
 
msgid "Available members"
 
msgstr "Membres disponibles"
 

	
 
msgid "User Groups Administration"
 
msgstr "Administration des groupes d'utilisateurs"
 

	
 
msgid "Add user"
 
msgstr "Ajouter un utilisateur"
 

	
 
msgid "Users"
 
msgstr "Utilisateurs"
 

	
 
msgid "Add User"
 
msgstr "Ajouter un utilisateur"
 

	
 
msgid "Password confirmation"
 
msgstr "Confirmation"
 

	
 
msgid "%s user settings"
 
msgstr "Réglages de l'utilisateur %s"
 

	
 
msgid "Emails"
 
msgstr "E-mails"
 

	
 
msgid "User: %s"
 
msgstr "Utilisateur : %s"
 

	
 
msgid "Source of Record"
 
msgstr "Source de l'enregistrement"
 

	
 
msgid "Last Login"
 
msgstr "Dernière connexion"
 

	
 
msgid "Member of User Groups"
 
msgstr "Membre des groupes d'utilisateurs"
 

	
 
msgid "Confirm to delete this user: %s"
 
msgstr "Voulez-vous vraiment supprimer l’utilisateur « %s » ?"
kallithea/i18n/ja/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -246,391 +246,384 @@ msgid "1 day"
 
msgstr "1 日"
 

	
 
msgid "1 month"
 
msgstr "1 ヶ月"
 

	
 
msgid "Lifetime"
 
msgstr "有効期間"
 

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

	
 
msgid "Deleted gist %s"
 
msgstr "gist %s を削除しました"
 

	
 
msgid "Unmodified"
 
msgstr "変更しない"
 

	
 
msgid "Successfully updated gist content"
 
msgstr "Gist の内容を更新しました"
 

	
 
msgid "Successfully updated gist data"
 
msgstr "Gist データを更新しました"
 

	
 
msgid "Error occurred during update of gist %s"
 
msgstr "Gist %s の更新中にエラーが発生しました"
 

	
 
msgid "You can't edit this user since it's crucial for entire application"
 
msgstr "このユーザーはアプリケーション全体で非常に重要なので編集できません"
 

	
 
msgid "Your account was updated successfully"
 
msgstr "アカウントの更新に成功しました"
 

	
 
msgid "Error occurred during update of user %s"
 
msgstr "ユーザー %s の更新中にエラーが発生しました"
 

	
 
msgid "Error occurred during update of user password"
 
msgstr "パスワードの更新中にエラーが発生しました"
 

	
 
msgid "Added email %s to user"
 
msgstr "ユーザーにメールアドレス %s を追加しました"
 

	
 
msgid "An error occurred during email saving"
 
msgstr "メールの保存時にエラーが発生しました"
 

	
 
msgid "Removed email from user"
 
msgstr "ユーザーからメールアドレスを削除しました"
 

	
 
msgid "API key successfully created"
 
msgstr "APIキーの作成に成功しました"
 

	
 
msgid "API key successfully reset"
 
msgstr "APIキーのリセットに成功しました"
 

	
 
msgid "API key successfully deleted"
 
msgstr "APIキーの削除に成功しました"
 

	
 
msgid "Read"
 
msgstr "読込"
 

	
 
msgid "Write"
 
msgstr "書込"
 

	
 
msgid "Admin"
 
msgstr "管理"
 

	
 
msgid "Disabled"
 
msgstr "無効"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "手動でアカウントをアクティベートする"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "自動でアカウントをアクティベートする"
 

	
 
msgid "Manual activation of external account"
 
msgstr "外部アカウントを手動でアクティベートする"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "外部アカウントを自動でアクティベートする"
 

	
 
msgid "Enabled"
 
msgstr "有効"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "全般の権限の更新に成功しました"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "権限の更新中にエラーが発生しました"
 

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

	
 
msgid "Created repository group %s"
 
msgstr "リポジトリグループ %s を作成しました"
 

	
 
msgid "Updated repository group %s"
 
msgstr "リポジトリグループ %s を更新しました"
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
 
msgid "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 "このページを閲覧するためにはサインインが必要です"
 

	
 
msgid "Repository not found in the filesystem"
 
msgstr "ファイルシステム内にリポジトリが見つかりません"
 

	
 
msgid "Binary file"
 
msgstr "バイナリファイル"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"チェンジセットが大きすぎるため省略しました。差分を表示する場合は差分メ"
 
"ニューを使用してください"
 

	
 
msgid "No changes detected"
 
msgstr "検出された変更はありません"
 

	
 
msgid "Deleted branch: %s"
 
msgstr "削除されたブランチ: %s"
 

	
 
msgid "Created tag: %s"
 
msgstr "作成したタグ: %s"
 

	
 
msgid "Show all combined changesets %s->%s"
 
msgstr "%s から %s までのすべてのチェンジセットを表示"
 

	
 
msgid "Compare view"
 
msgstr "比較ビュー"
 

	
 
msgid "and"
 
msgstr "と"
 

	
 
msgid "%s more"
 
msgstr "%s 以上"
 

	
 
msgid "revisions"
 
msgstr "リビジョン"
 

	
 
msgid "Fork name %s"
 
msgstr "フォーク名 %s"
 

	
 
msgid "Pull request %s"
 
msgstr "プルリクエスト #%s"
 

	
 
msgid "[deleted] repository"
 
msgstr "リポジトリを[削除]"
 

	
 
msgid "[created] repository"
 
msgstr "リポジトリを[作成]"
 

	
 
msgid "[created] repository as fork"
 
msgstr "フォークしてリポジトリを[作成]"
 

	
 
msgid "[forked] repository"
 
msgstr "リポジトリを[フォーク]"
 

	
 
msgid "[updated] repository"
 
msgstr "リポジトリを[更新]"
 

	
 
msgid "[downloaded] archive from repository"
 
msgstr "リポジトリからアーカイブを[ダウンロード]"
 

	
 
msgid "[delete] repository"
 
msgstr "リポジトリを[削除]"
 

	
 
msgid "[created] user"
 
msgstr "ユーザーを[作成]"
 

	
 
msgid "[updated] user"
 
msgstr "ユーザーを[更新]"
 

	
 
msgid "[created] user group"
 
msgstr "ユーザーグループを[作成]"
 

	
 
msgid "[updated] user group"
 
msgstr "ユーザーグループを[更新]"
 

	
 
msgid "[commented] on revision in repository"
 
msgstr "リポジトリのリビジョンに[コメント]"
 

	
 
msgid "[commented] on pull request for"
 
msgstr "プルリクエストに[コメント]"
 

	
 
msgid "[closed] pull request for"
 
msgstr "プルリクエストを[クローズ]"
 

	
 
msgid "[pushed] into"
 
msgstr "[プッシュ]"
 

	
 
msgid "[committed via Kallithea] into repository"
 
msgstr "リポジトリに[Kallithea経由でコミット]"
 

	
 
msgid "[pulled from remote] into repository"
 
msgstr "リポジトリに[リモートからプル]"
 

	
 
msgid "[pulled] from"
 
msgstr "[プル]"
 
@@ -1622,394 +1615,384 @@ msgstr "リモートリポジトリ"
 

	
 
msgid "Repository URL"
 
msgstr "リポジトリURL"
 

	
 
msgid ""
 
"Optional: URL of a remote repository. If set, the repository can be "
 
"pulled from this URL."
 
msgstr ""
 
"オプション: リモートリポジトリのURLです。設定した場合、このURLから変更を取"
 
"得することができます。"
 

	
 
msgid "Default revision for files page, downloads, whoosh and readme"
 
msgstr ""
 
"ファイルページ、ダウンロード、検索、READMEのデフォルトのリビジョンを指定し"
 
"ます"
 

	
 
msgid "Change owner of this repository."
 
msgstr "リポジトリの所有者を変更"
 

	
 
msgid "Processed commits"
 
msgstr "処理済みコミット数"
 

	
 
msgid "Processed progress"
 
msgstr "処理状況"
 

	
 
msgid "Reset Statistics"
 
msgstr "統計情報をリセット"
 

	
 
msgid "Confirm to remove current statistics."
 
msgstr "現在の統計情報をリセットしてもよろしいですか?"
 

	
 
msgid "Repositories Administration"
 
msgstr "リポジトリ管理"
 

	
 
msgid "State"
 
msgstr "状態"
 

	
 
msgid "Settings Administration"
 
msgstr "設定管理"
 

	
 
msgid "VCS"
 
msgstr "VCS"
 

	
 
msgid "Remap and Rescan"
 
msgstr "再マップと再スキャン"
 

	
 
msgid "Visual"
 
msgstr "表示"
 

	
 
msgid "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 "Set a custom title for your Kallithea Service."
 
msgstr "このKallitheaサービスのカスタムタイトルを設定します。"
 

	
 
msgid "HTTP authentication realm"
 
msgstr "HTTP認証レルム"
 

	
 
msgid "ReCaptcha public key"
 
msgstr "ReCaptcha 公開鍵"
 

	
 
msgid "Public key for reCaptcha system."
 
msgstr "reCaptchaの公開鍵。"
 

	
 
msgid "ReCaptcha private key"
 
msgstr "ReCaptcha 秘密鍵"
 

	
 
msgid ""
 
"Private key for reCaptcha system. Setting this value will enable captcha "
 
"on registration."
 
msgstr ""
 
"reCaptchaの秘密鍵。この値が設定されると登録時のキャプチャが有効になりま"
 
"す。"
 

	
 
msgid "Save Settings"
 
msgstr "設定を保存"
 

	
 
msgid "Built-in Mercurial Hooks (Read-Only)"
 
msgstr "組み込みのMercurialフック (編集不可)"
 

	
 
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 "まだメンバーがいません"
 

	
 
msgid "Chosen group members"
 
msgstr "グループメンバーを選ぶ"
 

	
 
msgid "Available members"
 
msgstr "有効なメンバー"
 

	
 
msgid "User Groups Administration"
 
msgstr "ユーザーグループ管理"
 

	
 
msgid "Add user"
 
msgstr "ユーザーを追加"
 

	
 
msgid "Users"
 
msgstr "ユーザー"
 

	
 
msgid "Add User"
 
msgstr "ユーザーを追加"
 

	
 
msgid "Password confirmation"
 
msgstr "パスワード再入力"
 

	
 
msgid "%s user settings"
 
msgstr "%s ユーザー設定"
 

	
 
msgid "Emails"
 
msgstr "メールアドレス"
 

	
 
msgid "User: %s"
 
msgstr "ユーザー: %s"
 

	
 
msgid "Source of Record"
 
msgstr "アカウントのソース"
 

	
 
msgid "Last Login"
 
msgstr "最終ログイン日時"
 

	
 
msgid "Member of User Groups"
 
msgstr "グループのメンバー数"
 

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

	
 
msgid "Delete this user"
 
msgstr "このユーザーを削除"
 

	
 
msgid "Inherited from %s"
 
msgstr "%s から継承"
 

	
 
msgid "Name in Source of Record"
 
msgstr "アカウントのソースでの名前"
 

	
 
msgid "New password confirmation"
 
msgstr "新しいパスワード 再入力"
 

	
 
msgid "Users Administration"
 
msgstr "ユーザー管理"
 

	
 
msgid "Auth Type"
 
msgstr "認証タイプ"
 

	
 
msgid "Server instance: %s"
 
msgstr "サーバーインスタンス: %s"
 

	
 
msgid "Support"
 
msgstr "サポート"
 

	
 
msgid "Mercurial repository"
 
msgstr "Mercurialリポジトリ"
 

	
 
msgid "Git repository"
 
msgstr "Gitリポジトリ"
 

	
 
msgid "Create Fork"
 
msgstr "フォークを作成"
 

	
 
msgid "Summary"
 
msgstr "要約"
 

	
 
msgid "Changelog"
 
msgstr "履歴"
 

	
 
msgid "Files"
 
msgstr "ファイル"
 

	
 
msgid "Show Pull Requests for %s"
 
msgstr "%s のプルリクエストを表示"
 

	
 
msgid "Pull Requests"
 
msgstr "プルリクエスト"
 

	
 
msgid "Options"
 
msgstr "オプション"
 

	
 
msgid "Compare Fork"
 
msgstr "フォークと比較"
kallithea/i18n/pl/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -1166,387 +1166,384 @@ msgstr ""
 

	
 
msgid "Apply to all existing repositories"
 
msgstr "Zastosuj do wszystkich Istniejących repozytoriów"
 

	
 
msgid "Repository group"
 
msgstr "Repozytorium grupy"
 

	
 
msgid ""
 
"All default permissions on each repository group will be reset to chosen "
 
"permission, note that all custom default permission on repository groups "
 
"will be lost"
 
msgstr ""
 
"Wszystkie uprawnienia domyślne każdego repozytorium zostaną przywrócone. "
 
"Wybrane uprawnienie zostaną skasowane. Pamiętaj, że wszystkie "
 
"niestandardowe uprawnienia w repozytoriach zostaną utracone"
 

	
 
msgid "Apply to all existing repository groups"
 
msgstr "Zastosuj do wszystkich istniejących grup repozytoriów"
 

	
 
msgid "User group"
 
msgstr "Grupa użytkownika"
 

	
 
msgid ""
 
"All default permissions on each user group will be reset to chosen "
 
"permission, note that all custom default permission on user groups will "
 
"be lost"
 
msgstr ""
 
"Wszystkie Uprawnienia domyślne każdej grupy użytkowników zostaną "
 
"przywrócone do wybranego zezwolenia, trzeba pamiętać, że wszystkie "
 
"niestandardowe uprawnienia domyślne dla grup repozytorium zostaną utracone"
 

	
 
msgid "Top level repository creation"
 
msgstr "Tworzenie repozytoriów najwyższego poziomu"
 

	
 
msgid "User group creation"
 
msgstr "Tworzenie grupy użytkowników"
 

	
 
msgid "Repository forking"
 
msgstr "Rozwidlanie repozytorium"
 

	
 
msgid "Registration"
 
msgstr "Rejestracja"
 

	
 
msgid "External auth account activation"
 
msgstr "Autoryzacja aktywacji zewnętrznego konta"
 

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

	
 
msgid "New IP address"
 
msgstr "Nowy adres IP"
 

	
 
msgid "Repository Groups"
 
msgstr "Grupy Repozytoriów"
 

	
 
msgid "Group name"
 
msgstr "Nazwa grupy"
 

	
 
msgid "Group parent"
 
msgstr "Rodzic grupy"
 

	
 
msgid "Settings"
 
msgstr "Ustawienia"
 

	
 
msgid "Advanced"
 
msgstr "Zaawansowane"
 

	
 
msgid "Permissions"
 
msgstr "Uprawnienia"
 

	
 
msgid "Repository Group: %s"
 
msgstr "Grupa Repozytoriów: %s"
 

	
 
msgid "Total repositories"
 
msgstr "Ogólna liczba repozytoriów"
 

	
 
msgid "Created on"
 
msgstr "Utworzono"
 

	
 
msgid "Confirm to delete this group: %s with %s repository"
 
msgid_plural "Confirm to delete this group: %s with %s repositories"
 
msgstr[0] "Potwierdź żeby usunąć grupę %s wraz z %s repozytorium"
 
msgstr[1] "Potwierdź żeby usunąć grupę %s wraz z %s repozytoriami"
 
msgstr[2] "Potwierdź żeby usunąć grupę %s wraz z %s repozytoriami"
 

	
 
msgid "Delete this repository group"
 
msgstr "Usuń tę grupę repozytoriów"
 

	
 
msgid "Add new"
 
msgstr "Dodaj nowe"
 

	
 
msgid "Both"
 
msgstr "Oba"
 

	
 
msgid ""
 
"Keep it short and to the point. Use a README file for longer descriptions."
 
msgstr ""
 
"Powinna być krótka i na temat. Użyj pliku README dla dłuższych opisów."
 

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

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

	
 
msgid "Landing revision"
 
msgstr "Docelowa rewizja"
 

	
 
msgid "Remote"
 
msgstr "Zdalnie"
 

	
 
msgid "Statistics"
 
msgstr "Statystyki"
 

	
 
msgid "Set"
 
msgstr "Ustaw"
 

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

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

	
 
msgid "Detach forks"
 
msgstr "Ustaw jako rozwidlenie"
 

	
 
msgid "Delete forks"
 
msgstr "Usuń rozwidlenie"
 

	
 
msgid "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"
 
msgstr "Szukaj"
 

	
 
msgid "Follow"
 
msgstr "Obserwuj"
 

	
 
msgid "Unfollow"
 
msgstr "Nie obserwuj"
 

	
 
msgid "Fork"
 
msgstr "Gałąź"
 

	
 
msgid "Create Pull Request"
 
msgstr "Stwórz nowe żądanie połączenia gałęzi"
 

	
 
msgid "Switch To"
 
msgstr "Przełącz do"
 

	
 
msgid "Show recent activity"
 
msgstr "Pokaż ostatnią aktywność"
 

	
 
msgid "Public journal"
 
msgstr "Dziennik publiczny"
 

	
 
msgid "Show public gists"
 
msgstr "Wyświetl publiczne gists"
 

	
 
msgid "Gists"
 
msgstr "Gists"
 

	
 
msgid "Search in repositories"
 
msgstr "Szukaj we wszystkich repozytoriach"
 

	
 
msgid "Log Out"
 
msgstr "Wyloguj się"
 

	
 
msgid "Create repositories"
 
msgstr "Utwórz repozytorium"
 

	
 
msgid "Select this option to allow repository creation for this user"
 
msgstr ""
 
"Wybierz tę opcję, aby umożliwić stworzenie repozytorium dla tego "
 
"użytkownika"
 

	
 
msgid "Create user groups"
 
msgstr "Tworzenie grup użytkowników"
 

	
 
msgid "Select this option to allow user group creation for this user"
 
msgstr ""
 
"Wybierz tę opcję, aby umożliwić utworzenie grupy użytkowników dla tego "
 
"użytkownika"
 

	
 
msgid "Fork repositories"
 
msgstr "Rozwidlenie repozytorium"
 

	
 
msgid "Select this option to allow repository forking for this user"
 
msgstr ""
 
"Wybierz tę opcję, aby umożliwić rozwidlania repozytorium dla tego "
 
"użytkownika"
 

	
 
msgid "Show"
 
msgstr "Wyświetl"
 

	
 
msgid "No permissions defined yet"
 
msgstr "Nie ma jeszcze ustawionych uprawnień"
 

	
 
msgid "Permission"
 
msgstr "Uprawnienia"
 

	
 
msgid "Edit Permission"
 
msgstr "Edycja Uprawnień"
 

	
 
msgid "Stop following this repository"
 
msgstr "Zakończyć obserwację tego repozytorium"
 

	
 
msgid "Start following this repository"
 
msgstr "Zacznij obserwację tego repozytorium"
 

	
 
msgid "Group"
 
msgstr "Grupa"
 

	
 
msgid "Loading ..."
 
msgstr "Ładuję..."
 

	
 
msgid "loading ..."
 
msgstr "ładuję ..."
 

	
 
msgid "Search truncated"
 
msgstr "Szukaj obcięte"
 

	
 
msgid "No matching files"
 
msgstr "Nie ma plików pasujących"
 

	
 
msgid "Failed to revoke permission"
 
msgstr "Nie udało się cofnąć uprawnienia"
 

	
 
msgid "Select changeset"
kallithea/i18n/pt/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -822,387 +822,384 @@ msgid "Delete"
 
msgstr "Apagar"
 

	
 
msgid "Edit"
 
msgstr "Editar"
 

	
 
msgid "created"
 
msgstr "criado"
 

	
 
msgid "Show as raw"
 
msgstr "Mostrar original"
 

	
 
msgid "My Account"
 
msgstr "Minha Conta"
 

	
 
msgid "Add"
 
msgstr "Adicionar"
 

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

	
 
msgid "New email address"
 
msgstr "Novo endereço de email"
 

	
 
msgid "New password"
 
msgstr "Nova palavra-passe"
 

	
 
msgid "Name"
 
msgstr "Nome"
 

	
 
msgid "Anonymous access"
 
msgstr "Acesso anônimo"
 

	
 
msgid ""
 
"All default permissions on each repository will be reset to chosen "
 
"permission, note that all custom default permission on repositories will "
 
"be lost"
 
msgstr ""
 
"Todas as permissões predefinidos em cada repositório serão modificadas "
 
"para a permissão escolhida, note que todas as permissões predefinidas "
 
"customizadas nos repositórios serão perdidas"
 

	
 
msgid "Repository group"
 
msgstr "Grupo de repositórios"
 

	
 
msgid ""
 
"All default permissions on each repository group will be reset to chosen "
 
"permission, note that all custom default permission on repository groups "
 
"will be lost"
 
msgstr ""
 
"Todas as permissões predefinidas em cada grupo de repositórios serão "
 
"modificadas para a permissão escolhida, note que todas as permissões "
 
"predefinidas customizadas em grupos de repositórios serão perdidas"
 

	
 
msgid "User group"
 
msgstr "Grupo de utilizadores"
 

	
 
msgid "User group creation"
 
msgstr "Criação de grupo de utilizadores"
 

	
 
msgid "Repository forking"
 
msgstr "Bifurcação de repositório"
 

	
 
msgid "Registration"
 
msgstr "Registo"
 

	
 
msgid "External auth account activation"
 
msgstr "Ativação de autenticação de conta externa"
 

	
 
msgid "New IP address"
 
msgstr "Novo endereço IP"
 

	
 
msgid "Group name"
 
msgstr "Nome do grupo"
 

	
 
msgid "Group parent"
 
msgstr "Progenitor do grupo"
 

	
 
msgid "Settings"
 
msgstr "Configurações"
 

	
 
msgid "Permissions"
 
msgstr "Permissões"
 

	
 
msgid "Created on"
 
msgstr "Criado em"
 

	
 
msgid "Confirm to delete this group: %s with %s repository"
 
msgid_plural "Confirm to delete this group: %s with %s repositories"
 
msgstr[0] "Confirme para apagar este grupo: %s com %s repositório"
 
msgstr[1] "Confirme para apagar este grupo: %s com %s repositórios"
 

	
 
msgid "Add new"
 
msgstr "Adicionar novo"
 

	
 
msgid ""
 
"Keep it short and to the point. Use a README file for longer descriptions."
 
msgstr ""
 
"Seja sucinto e objetivo. Use um 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"
 

	
 
msgid "Follow"
 
msgstr "Seguir"
 

	
 
msgid "Unfollow"
 
msgstr "Parar de seguir"
 

	
 
msgid "Fork"
 
msgstr "Bifurcação"
 

	
 
msgid "Create Pull Request"
 
msgstr "Criar Pull Request"
 

	
 
msgid "Switch To"
 
msgstr "Trocar Para"
 

	
 
msgid "Show recent activity"
 
msgstr "Mostrar atividade recente"
 

	
 
msgid "Public journal"
 
msgstr "Diário público"
 

	
 
msgid "Show public gists"
 
msgstr "Mostrar gists públicos"
 

	
 
msgid "Gists"
 
msgstr "Gists"
 

	
 
msgid "Search in repositories"
 
msgstr "Buscar nos repositórios"
 

	
 
msgid "Log Out"
 
msgstr "Sair"
 

	
 
msgid "Create repositories"
 
msgstr "Criar repositórios"
 

	
 
msgid "Select this option to allow repository creation for this user"
 
msgstr ""
 
"Selecione esta opção para permitir a criação de repositórios para este "
 
"utilizador"
 

	
 
msgid "Create user groups"
 
msgstr "Criar grupos de utilizadores"
 

	
 
msgid "Select this option to allow user group creation for this user"
 
msgstr ""
 
"Selecione esta opção para permitir a criação de grupos de utilizadores "
 
"para este utilizador"
 

	
 
msgid "Fork repositories"
 
msgstr "Bifurcar repositórios"
 

	
 
msgid "Select this option to allow repository forking for this user"
 
msgstr ""
 
"Selecione esta opção para permitir a bifurcação de repositórios para este "
 
"utilizador"
 

	
 
msgid "Show"
 
msgstr "Mostrar"
 

	
 
msgid "No permissions defined yet"
 
msgstr "Nenhuma permissão definida ainda"
 

	
 
msgid "Permission"
 
msgstr "Permissão"
 

	
 
msgid "Edit Permission"
 
msgstr "Editar Permissão"
 

	
 
msgid "Stop following this repository"
 
msgstr "Parar de seguir este repositório"
 

	
 
msgid "Start following this repository"
 
msgstr "Passar a seguir este repositório"
 

	
 
msgid "Group"
 
msgstr "Grupo"
 

	
 
msgid "Loading ..."
 
msgstr "Carregando..."
 

	
 
msgid "loading ..."
 
msgstr "carregando ..."
 

	
 
msgid "Search truncated"
 
msgstr "Busca truncada"
 

	
 
msgid "No matching files"
 
msgstr "Nenhum ficheiro encontrado"
 

	
 
msgid "Failed to revoke permission"
 
msgstr "Falhou ao revocar a permissão"
 

	
 
msgid "Click to sort ascending"
 
msgstr "Clique para ordenar em ordem crescente"
kallithea/i18n/pt_BR/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -820,387 +820,384 @@ msgstr "URL"
 

	
 
msgid "Delete"
 
msgstr "Excluir"
 

	
 
msgid "Edit"
 
msgstr "Editar"
 

	
 
msgid "created"
 
msgstr "criado"
 

	
 
msgid "Show as raw"
 
msgstr "Mostrar original"
 

	
 
msgid "My Account"
 
msgstr "Minha Conta"
 

	
 
msgid "Add"
 
msgstr "Adicionar"
 

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

	
 
msgid "New email address"
 
msgstr "Novo endereço de email"
 

	
 
msgid "New password"
 
msgstr "Nova senha"
 

	
 
msgid "Name"
 
msgstr "Nome"
 

	
 
msgid "Anonymous access"
 
msgstr "Acesso anônimo"
 

	
 
msgid ""
 
"All default permissions on each repository will be reset to chosen "
 
"permission, note that all custom default permission on repositories will "
 
"be lost"
 
msgstr ""
 
"Todas as permissões padrão em cada repositório serão modificadas para a "
 
"permissão escolhida, note que todas as permissões padrão customizadas nos "
 
"repositórios serão perdidas"
 

	
 
msgid "Repository group"
 
msgstr "Grupo de repositórios"
 

	
 
msgid ""
 
"All default permissions on each repository group will be reset to chosen "
 
"permission, note that all custom default permission on repository groups "
 
"will be lost"
 
msgstr ""
 
"Todas as permissões padrão em cada grupo de repositórios serão "
 
"modificadas para a permissão escolhida, note que todas as permissões "
 
"padrão customizadas em grupos de repositórios serão perdidas"
 

	
 
msgid "User group"
 
msgstr "Grupo de usuários"
 

	
 
msgid "User group creation"
 
msgstr "Criação de grupo de usuários"
 

	
 
msgid "Repository forking"
 
msgstr "Bifurcação de repositório"
 

	
 
msgid "Registration"
 
msgstr "Registro"
 

	
 
msgid "External auth account activation"
 
msgstr "Ativação de autenticação de conta externa"
 

	
 
msgid "New IP address"
 
msgstr "Novo endereço IP"
 

	
 
msgid "Group name"
 
msgstr "Nome do grupo"
 

	
 
msgid "Group parent"
 
msgstr "Progenitor do grupo"
 

	
 
msgid "Settings"
 
msgstr "Configurações"
 

	
 
msgid "Permissions"
 
msgstr "Permissões"
 

	
 
msgid "Created on"
 
msgstr "Criado em"
 

	
 
msgid "Confirm to delete this group: %s with %s repository"
 
msgid_plural "Confirm to delete this group: %s with %s repositories"
 
msgstr[0] "Confirme para excluir este grupo: %s com %s repositório"
 
msgstr[1] "Confirme para excluir este grupo: %s com %s repositórios"
 

	
 
msgid "Add new"
 
msgstr "Adicionar novo"
 

	
 
msgid ""
 
"Keep it short and to the point. Use a README file for longer descriptions."
 
msgstr ""
 
"Seja sucinto e objetivo. Use um arquivo README para descrições mais "
 
"longas."
 

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

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

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

	
 
msgid "Remote"
 
msgstr "Remoto"
 

	
 
msgid "Statistics"
 
msgstr "Estatísticas"
 

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

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

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

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

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

	
 
msgid "Follow"
 
msgstr "Seguir"
 

	
 
msgid "Unfollow"
 
msgstr "Parar de seguir"
 

	
 
msgid "Fork"
 
msgstr "Bifurcação"
 

	
 
msgid "Create Pull Request"
 
msgstr "Criar Pull Request"
 

	
 
msgid "Switch To"
 
msgstr "Trocar Para"
 

	
 
msgid "Show recent activity"
 
msgstr "Mostrar atividade recente"
 

	
 
msgid "Public journal"
 
msgstr "Diário público"
 

	
 
msgid "Show public gists"
 
msgstr "Mostrar gists públicos"
 

	
 
msgid "Gists"
 
msgstr "Gists"
 

	
 
msgid "Search in repositories"
 
msgstr "Buscar nos repositórios"
 

	
 
msgid "Log Out"
 
msgstr "Sair"
 

	
 
msgid "Create repositories"
 
msgstr "Criar repositórios"
 

	
 
msgid "Select this option to allow repository creation for this user"
 
msgstr ""
 
"Selecione esta opção para permitir a criação de repositórios para este "
 
"usuário"
 

	
 
msgid "Create user groups"
 
msgstr "Criar grupos de usuários"
 

	
 
msgid "Select this option to allow user group creation for this user"
 
msgstr ""
 
"Selecione esta opção para permitir a criação de grupos de usuários para "
 
"este usuário"
 

	
 
msgid "Fork repositories"
 
msgstr "Bufurcar repositórios"
 

	
 
msgid "Select this option to allow repository forking for this user"
 
msgstr ""
 
"Selecione esta opção para permitir a bifurcação de repositórios para este "
 
"usuário"
 

	
 
msgid "Show"
 
msgstr "Mostrar"
 

	
 
msgid "No permissions defined yet"
 
msgstr "Nenhuma permissão definida ainda"
 

	
 
msgid "Permission"
 
msgstr "Permissão"
 

	
 
msgid "Edit Permission"
 
msgstr "Editar Permissão"
 

	
 
msgid "Stop following this repository"
 
msgstr "Parar de seguir este repositório"
 

	
 
msgid "Start following this repository"
 
msgstr "Passar a seguir este repositório"
 

	
 
msgid "Group"
 
msgstr "Grupo"
 

	
 
msgid "Loading ..."
 
msgstr "Carregando..."
 

	
 
msgid "loading ..."
 
msgstr "carregando ..."
 

	
 
msgid "Search truncated"
 
msgstr "Busca truncada"
 

	
 
msgid "No matching files"
 
msgstr "Nenhum arquivo encontrado"
 

	
 
msgid "Failed to revoke permission"
 
msgstr "Falhou ao revocar a permissão"
 

	
 
msgid "Click to sort ascending"
 
msgstr "Clique para ordenar em ordem crescente"
kallithea/i18n/ru/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -338,391 +338,384 @@ msgstr "Gist-запись %s удалена"
 

	
 
msgid "Unmodified"
 
msgstr "Неизменный"
 

	
 
msgid "Successfully updated gist content"
 
msgstr "Содержимое gist-записи обновлено"
 

	
 
msgid "Successfully updated gist data"
 
msgstr "Данные gist-записи обновлены"
 

	
 
msgid "Error occurred during update of gist %s"
 
msgstr "Произошла ошибка при обновлении gist-записи %s"
 

	
 
msgid "You can't edit this user since it's crucial for entire application"
 
msgstr ""
 
"Вы не можете изменить данные этого пользователя, поскольку он важен для "
 
"работы всего приложения"
 

	
 
msgid "Your account was updated successfully"
 
msgstr "Ваша учетная запись успешно обновлена"
 

	
 
msgid "Error occurred during update of user %s"
 
msgstr "Произошла ошибка при обновлении пользователя %s"
 

	
 
msgid "Error occurred during update of user password"
 
msgstr "Ошибка при обновлении пароля"
 

	
 
msgid "Added email %s to user"
 
msgstr "Пользователю добавлен e-mail %s"
 

	
 
msgid "An error occurred during email saving"
 
msgstr "Произошла ошибка при сохранении e-mail"
 

	
 
msgid "Removed email from user"
 
msgstr "E-mail пользователя удалён"
 

	
 
msgid "API key successfully created"
 
msgstr "API-ключ успешно создан"
 

	
 
msgid "API key successfully reset"
 
msgstr "API-ключ успешно сброшен"
 

	
 
msgid "API key successfully deleted"
 
msgstr "API-ключ успешно удалён"
 

	
 
msgid "SSH key %s successfully added"
 
msgstr "Ключ SSH %s успешно добавлен"
 

	
 
msgid "SSH key successfully deleted"
 
msgstr "Ключ SSH успешно удалён"
 

	
 
msgid "Read"
 
msgstr "Чтение"
 

	
 
msgid "Write"
 
msgstr "Запись"
 

	
 
msgid "Admin"
 
msgstr "Администратор"
 

	
 
msgid "Disabled"
 
msgstr "Отключено"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Разрешена, с ручной активацией учётной записи"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Разрешена, с автоматической активацией учётной записи"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Ручная активация внешней учетной записи"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Автоматическая активация внешней учетной записи"
 

	
 
msgid "Enabled"
 
msgstr "Включено"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Глобальные привилегии успешно обновлены"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Произошла ошибка во время обновления привилегий"
 

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

	
 
msgid "Created repository group %s"
 
msgstr "Создана новая группа репозиториев %s"
 

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

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

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

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

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

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

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

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

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

	
 
msgid "Error creating repository %s"
 
msgstr "Произошла ошибка при создании репозитория %s"
 

	
 
msgid "Created repository %s from %s"
 
msgstr "Репозиторий %s создан из %s"
 

	
 
msgid "Forked repository %s as %s"
 
msgstr "Создан форк репозитория %s с именем %s"
 

	
 
msgid "Created repository %s"
 
msgstr "Репозиторий %s создан"
 

	
 
msgid "Repository %s updated successfully"
 
msgstr "Репозитарий %s успешно обновлён"
 

	
 
msgid "Error occurred during update of repository %s"
 
msgstr "Произошла ошибка во время обновления репозитория %s"
 

	
 
msgid "Detached %s forks"
 
msgstr "Форки %s отсоединены"
 

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

	
 
msgid "Deleted repository %s"
 
msgstr "Репозиторий %s удалён"
 

	
 
msgid "Cannot delete repository %s which still has forks"
 
msgstr "Невозможно удалить репозиторий %s, поскольку существуют его форки"
 

	
 
msgid "An error occurred during deletion of %s"
 
msgstr "Произошла ошибка во время удаления %s"
 

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

	
 
msgid "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"
 
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 "Страница доступна только авторизованным пользователям"
 

	
 
msgid ""
 
"CSRF token leak has been detected - all form tokens have been expired"
 
msgstr "Обнаружена утечка CSRF-токена — истёк срок действия токенов форм"
 

	
 
msgid "Repository not found in the filesystem"
 
msgstr "Репозиторий не найден на файловой системе"
 

	
 
msgid "Changeset for %s %s not found in %s"
 
msgstr "Набор изменений для %s %s не найден в %s"
 

	
 
msgid "SSH access is disabled."
 
msgstr "Доступ по SSH отключен."
 

	
 
msgid "Binary file"
 
msgstr "Двоичный файл"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Набор изменения оказался слишком большими и был урезан, используйте меню "
 
"сравнения для показа результата сравнения"
 

	
 
msgid "No changes detected"
 
msgstr "Изменений не обнаружено"
 

	
 
msgid "Deleted branch: %s"
 
msgstr "Удалена ветка: %s"
 

	
 
msgid "Created tag: %s"
 
msgstr "Создан тег: %s"
 

	
 
msgid "Changeset %s not found"
 
msgstr "Набор изменений %s не найден"
 

	
 
msgid "Show all combined changesets %s->%s"
 
msgstr "Показать отличия вместе %s->%s"
 

	
 
msgid "Compare view"
 
msgstr "Сравнить вид"
 

	
 
msgid "and"
 
msgstr "и"
 

	
 
msgid "%s more"
 
msgstr "на %s больше"
 

	
 
msgid "revisions"
 
msgstr "версии"
 

	
 
msgid "Fork name %s"
 
msgstr "Имя форка %s"
 

	
 
msgid "Pull request %s"
 
msgstr "Pull-запрос %s"
 

	
 
msgid "[deleted] repository"
 
msgstr "[удален] репозиторий"
 

	
 
msgid "[created] repository"
 
msgstr "[создан] репозиторий"
 

	
 
msgid "[created] repository as fork"
 
msgstr "[создан] репозиторий в качестве форка"
 

	
 
msgid "[forked] repository"
 
msgstr "[создан форк] репозитория"
 

	
 
msgid "[updated] repository"
 
msgstr "[обновлён] репозиторий"
 

	
 
msgid "[downloaded] archive from repository"
 
msgstr "[загружен] архив из репозитория"
 

	
 
msgid "[delete] repository"
 
msgstr "[удален] репозиторий"
 

	
 
msgid "[created] user"
 
msgstr "[создан] пользователь"
 

	
 
msgid "[updated] user"
 
msgstr "[обновлён] пользователь"
 

	
 
msgid "[created] user group"
 
@@ -1005,391 +998,384 @@ msgid ""
 
"[Comment] %(repo_name)s changeset %(short_id)s \"%(message_short)s\" on "
 
"%(branch)s"
 
msgstr ""
 
"[Комментарий] к набору изменений %(short_id)s «%(message_short)s» "
 
"репозитория %(repo_name)s в %(branch)s"
 

	
 
msgid "New user %(new_username)s registered"
 
msgstr "Новый пользователь \"%(new_username)s\" зарегистрирован"
 

	
 
msgid ""
 
"[Review] %(repo_name)s PR %(pr_nice_id)s \"%(pr_title_short)s\" from "
 
"%(pr_source_branch)s by %(pr_owner_username)s"
 
msgstr ""
 
"[Ревью] к PR %(pr_nice_id)s «%(pr_title_short)s» из %(pr_source_branch)s "
 
"репозитория %(repo_name)s от %(pr_owner_username)s"
 

	
 
msgid ""
 
"[Comment] %(repo_name)s PR %(pr_nice_id)s \"%(pr_title_short)s\" from "
 
"%(pr_source_branch)s by %(pr_owner_username)s"
 
msgstr ""
 
"[Комментарий] к PR %(pr_nice_id)s «%(pr_title_short)s» из "
 
"%(pr_source_branch)s репозитория %(repo_name)s от %(pr_owner_username)s"
 

	
 
msgid "Closing"
 
msgstr "Закрыт"
 

	
 
msgid ""
 
"%(user)s wants you to review pull request %(pr_nice_id)s: %(pr_title)s"
 
msgstr ""
 
"%(user)s просит вас рассмотреть pull-запрос %(pr_nice_id)s: %(pr_title)s"
 

	
 
msgid "Cannot create empty pull request"
 
msgstr "Невозможно создать пустой pull-запрос"
 

	
 
msgid ""
 
"Cannot create pull request - criss cross merge detected, please merge a "
 
"later %s revision to %s"
 
msgstr ""
 
"Невозможно создать pull-запрос — обнаружено перекрёстное слияние. "
 
"Попробуйте слить более позднюю ревизию %s с %s"
 

	
 
msgid "You are not authorized to create the pull request"
 
msgstr "Недостаточно привилегий для создания pull-запроса"
 

	
 
msgid "Missing changesets since the previous iteration:"
 
msgstr "Отсутствующие ревизии относительно предыдущей итерации:"
 

	
 
msgid "New changesets on %s %s since the previous iteration:"
 
msgstr "Новые наборы изменений в %s %s относительно предыдущей итерации:"
 

	
 
msgid "Ancestor didn't change - diff since previous iteration:"
 
msgstr "Предок не изменился — разница с момента последней итерации:"
 

	
 
msgid ""
 
"This iteration is based on another %s revision and there is no simple "
 
"diff."
 
msgstr ""
 
"Эта итерация основана на другой ревизии %s, простой diff невозможен."
 

	
 
msgid "No changes found on %s %s since previous iteration."
 
msgstr "Нет изменений на %s %s относительно предыдущей итерации."
 

	
 
msgid "Closed, next iteration: %s ."
 
msgstr "Закрыто. Следующая итерация: %s."
 

	
 
msgid "latest tip"
 
msgstr "последняя версия"
 

	
 
msgid "SSH key %r is invalid: %s"
 
msgstr "Ошибка ключа SSH %r: %s"
 

	
 
msgid "SSH key %s is already used by %s"
 
msgstr "Ключ SSH %s уже используется пользователем %s"
 

	
 
msgid "SSH key with fingerprint %r found"
 
msgstr "Найден ключ SSH с отпечатком %r"
 

	
 
msgid "New user registration"
 
msgstr "Регистрация нового пользователя"
 

	
 
msgid ""
 
"You can't remove this user since it is crucial for the entire application"
 
msgstr ""
 
"Вы не можете удалить этого пользователя, поскольку это критично для "
 
"работы всего приложения"
 

	
 
msgid ""
 
"User \"%s\" still owns %s repositories and cannot be removed. Switch "
 
"owners or remove those repositories: %s"
 
msgstr ""
 
"Пользователь \"%s\" всё ещё является владельцем %s репозиториев и поэтому "
 
"не может быть удалён. Смените владельца или удалите эти репозитории: %s"
 

	
 
msgid ""
 
"User \"%s\" still owns %s repository groups and cannot be removed. Switch "
 
"owners or remove those repository groups: %s"
 
msgstr ""
 
"Пользователь \"%s\" всё ещё является владельцем %s групп репозиториев и "
 
"поэтому не может быть удалён. Смените владельца или удалите данные "
 
"группы: %s"
 

	
 
msgid ""
 
"User \"%s\" still owns %s user groups and cannot be removed. Switch "
 
"owners or remove those user groups: %s"
 
msgstr ""
 
"Пользователь \"%s\" всё ещё является владельцем %s групп пользователей и "
 
"поэтому не может быть удалён. Смените владельца или удалите данные "
 
"группы: %s"
 

	
 
msgid "Password reset link"
 
msgstr "Ссылка сброса пароля"
 

	
 
msgid "Password reset notification"
 
msgstr "Уведомление о сбросе пароля"
 

	
 
msgid ""
 
"The password to your account %s has been changed using password reset "
 
"form."
 
msgstr "Пароль к вашему аккаунту %s был изменён через форму сброса пароля."
 

	
 
msgid "Value cannot be an empty list"
 
msgstr "Значение не может быть пустым списком"
 

	
 
msgid "Username \"%(username)s\" already exists"
 
msgstr "Пользователь с именем \"%(username)s\" уже существует"
 

	
 
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 "Оставаться авторизованным"
 

	
 
msgid "Forgot your password ?"
 
msgstr "Забыли пароль?"
 

	
 
msgid "Don't have an account ?"
 
msgstr "Нет аккаунта?"
 

	
 
msgid "Sign In"
 
msgstr "Войти"
 

	
 
msgid "Password Reset"
 
msgstr "Сброс пароля"
 

	
 
msgid "Reset Your Password to %s"
 
msgstr "Сброс пароля для %s"
 

	
 
msgid "Reset Your Password"
 
msgstr "Сброс пароля"
 

	
 
msgid "Email Address"
 
msgstr "Почтовый адрес"
 

	
 
msgid "Captcha"
 
msgstr "Капча"
 

	
 
msgid "Send Password Reset Email"
 
msgstr "Послать ссылку сброса пароля"
 

	
 
msgid ""
 
"A password reset link will be sent to the specified email address if it "
 
"is registered in the system."
 
msgstr ""
 
"Ссылка для сброса пароля была отправлена на соответствующий e-mail, если "
 
"он был зарегистрирован в системе."
 

	
 
msgid "You are about to set a new password for the email address %s."
 
msgstr "Вы собираетесь установить новый пароль для адреса %s."
 

	
 
msgid ""
 
"Note that you must use the same browser session for this as the one used "
 
"to request the password reset."
 
msgstr ""
 
"Обратите внимание, что вы должны оставаться в пределах этой сессии "
 
"браузера, поскольку в ней был запрошен сброс пароля."
 

	
 
msgid "Code you received in the email"
 
msgstr "Код, который вы получили по почте"
 

	
 
msgid "New Password"
 
msgstr "Новый пароль"
 

	
 
msgid "Confirm New Password"
 
msgstr "Подтверждение пароля"
 

	
 
msgid "Confirm"
 
msgstr "Подтвердить"
 

	
 
msgid "Sign Up"
 
msgstr "Регистрация"
 

	
 
msgid "Sign Up to %s"
 
msgstr "Регистра на %s"
 

	
 
msgid "Re-enter password"
 
msgstr "Повторите пароль"
 

	
 
msgid "First Name"
 
msgstr "Имя"
 

	
 
msgid "Last Name"
 
msgstr "Фамилия"
 

	
 
msgid "Email"
 
msgstr "E-mail"
 

	
 
msgid "Registered accounts are ready to use and need no further action."
 
msgstr ""
 
"Зарегистрированные аккаунты готовы к использованию и не требуют "
 
"дальнейших действий."
 

	
 
msgid "Please wait for an administrator to activate your account."
 
msgstr ""
 
"Пожалуйста, подождите, пока администратор подтвердит Вашу регистрацию."
 

	
 
msgid "Admin Journal"
 
msgstr "Журнал администратора"
 

	
 
msgid "journal filter..."
 
msgstr "фильтр..."
 

	
 
msgid "Filter"
 
msgstr "Отфильтровать"
 

	
 
msgid "%s Entry"
 
msgid_plural "%s Entries"
 
msgstr[0] "%s запись"
 
@@ -2153,394 +2139,384 @@ msgstr "Администрирование репозиториев"
 

	
 
msgid "State"
 
msgstr "Состояние"
 

	
 
msgid "Settings Administration"
 
msgstr "Администрирование настроек"
 

	
 
msgid "VCS"
 
msgstr "Контроль версий"
 

	
 
msgid "Remap and Rescan"
 
msgstr "Пересканирование"
 

	
 
msgid "Visual"
 
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 "Set a custom title for your Kallithea Service."
 
msgstr "Задать другое имя для Kallithea Service."
 

	
 
msgid "HTTP authentication realm"
 
msgstr "Приветствие для HTTP-аутентификации"
 

	
 
msgid "HTML/JavaScript/CSS customization block"
 
msgstr "Блок редактирования HTML/JavaScript/CSS"
 

	
 
msgid ""
 
"HTML (possibly with                         JavaScript and/or CSS) that "
 
"will be added to the bottom                         of every page. This "
 
"can be used for web analytics                         systems, but also "
 
"to                         perform instance-specific customizations like "
 
"adding a                         project banner at the top of every page."
 
msgstr ""
 
"Код HTML (можно с                         JavaScript и/или CSS), который "
 
"будет добавлен внизу                         каждой страницы. Может "
 
"использоваться для размещения                         веб-аналитики, но "
 
"также                         и для создания индивидуальных "
 
"модификаций,                         например, для размещения баннера "
 
"проекта                         на каждой странице."
 

	
 
msgid "ReCaptcha public key"
 
msgstr "Открытый ключ reCaptcha"
 

	
 
msgid "Public key for reCaptcha system."
 
msgstr "Открытый ключ системы reCaptcha."
 

	
 
msgid "ReCaptcha private key"
 
msgstr "Закрытый ключ reCaptcha"
 

	
 
msgid ""
 
"Private key for reCaptcha system. Setting this value will enable captcha "
 
"on registration."
 
msgstr ""
 
"Закрытый ключ системы reCaptcha. Задание этого значения включит капчу при "
 
"регистрации."
 

	
 
msgid "Save Settings"
 
msgstr "Сохранить настройки"
 

	
 
msgid "Built-in Mercurial Hooks (Read-Only)"
 
msgstr "Встроенные хуки Mercurial (только чтение)"
 

	
 
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 ""
 
"Хуки используются для активации действий при определённых событиях, "
 
"например, push/pull-запросах. Могут активироваться функции Python либо "
 
"внешние приложения."
 

	
 
msgid "Failed to remove hook"
 
msgstr "Не удалось удалить хук"
 

	
 
msgid "Rescan options"
 
msgstr "Опции пересканирования"
 

	
 
msgid "Delete records of missing repositories"
 
msgstr "Удалить записи об отсутствующих репозиториях"
 

	
 
msgid ""
 
"Check this option to remove all comments, pull requests and other records "
 
"related to repositories that no longer exist in the filesystem."
 
msgstr ""
 
"Отметьте для удаления всех комментариев, 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}   имя текущего "
 
"пользователя,\n"
 
"                                                    {netloc} сетевой путь/"
 
"адрес хоста сервера Kallithea,\n"
 
"                                                    {repo}   полное имя "
 
"репозитория,\n"
 
"                                                    {repoid} ID "
 
"репозитория, может применяться для клонирования по идентификатору,\n"
 
"                                                    {system_user}  имя "
 
"пользователя Kallithea в системе,\n"
 
"                                                    {hostname}  имя хоста "
 
"севера\n"
 
"                                                    "
 

	
 
msgid "SSH Clone URL"
 
msgstr "Ссылка для клонирования по SSH"
 

	
 
msgid ""
 
"Schema for constructing SSH clone URL, eg. 'ssh://{system_user}"
 
"@{hostname}/{repo}'."
 
msgstr ""
 
"Схема URL для клонирования по SSH, например: 'ssh://{system_user}"
 
"@{hostname}/{repo}'."
 

	
 
msgid "Repository page size"
 
msgstr "Размер страницы репозитория"
 

	
 
msgid ""
 
"Number of items displayed in the repository pages before pagination is "
 
"shown."
 
msgstr ""
 
"Количество элементов на странице репозитория до появления нумерации "
 
"страниц."
 

	
 
msgid "Admin page size"
 
msgstr "Размер страницы администратора"
 

	
 
msgid ""
 
"Number of items displayed in the admin pages grids before pagination is "
 
"shown."
 
msgstr ""
 
"Количество элементов в сетке страницы администратора до появления "
 
"нумерации страниц."
 

	
 
msgid "Icons"
 
msgstr "Иконки"
 

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

	
 
msgid "Show private repository icon on repositories"
 
msgstr "Показывать иконки приватных репозиториев"
 

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

	
 
msgid "Meta Tagging"
 
msgstr "Метатегирование"
 

	
 
msgid ""
 
"Parses meta tags from the repository description field and turns them "
 
"into colored tags."
 
msgstr ""
 
"Анализирует мета-теги в поле описания репозитория и отображает их в виде "
 
"цветных тегов."
 

	
 
msgid "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"
kallithea/i18n/uk/LC_MESSAGES/kallithea.po
Show inline comments
 
@@ -326,391 +326,384 @@ msgstr "Постійно"
 
msgid "Error occurred during gist creation"
 
msgstr "Сталася помилка під час створення GIST"
 

	
 
msgid "Deleted gist %s"
 
msgstr "Видалено gist %s"
 

	
 
msgid "Unmodified"
 
msgstr "Незмінений"
 

	
 
msgid "Successfully updated gist content"
 
msgstr "Зміст gist успішно оновлено"
 

	
 
msgid "Successfully updated gist data"
 
msgstr "Дані gist успішно оновлені"
 

	
 
msgid "Error occurred during update of gist %s"
 
msgstr "Сталася помилка під час оновлення gist %s"
 

	
 
msgid "You can't edit this user since it's crucial for entire application"
 
msgstr ""
 
"Ви не можете редагувати цього користувача, оскільки це важливо для всієї "
 
"програми"
 

	
 
msgid "Your account was updated successfully"
 
msgstr "Ваш обліковий запис успішно оновлено"
 

	
 
msgid "Error occurred during update of user %s"
 
msgstr "Сталася помилка під час оновлення користувача %s"
 

	
 
msgid "Error occurred during update of user password"
 
msgstr "Сталася помилка під час оновлення пароля користувача"
 

	
 
msgid "Added email %s to user"
 
msgstr "Додано email %s користувачу"
 

	
 
msgid "An error occurred during email saving"
 
msgstr "Сталася помилка під час збереження електронної пошти"
 

	
 
msgid "Removed email from user"
 
msgstr "Видалено email користувача"
 

	
 
msgid "API key successfully created"
 
msgstr "API ключ успішно створений"
 

	
 
msgid "API key successfully reset"
 
msgstr "Ключ API успішно скинуто"
 

	
 
msgid "API key successfully deleted"
 
msgstr "API ключ успішно видалений"
 

	
 
msgid "Read"
 
msgstr "Читати"
 

	
 
msgid "Write"
 
msgstr "Писати"
 

	
 
msgid "Admin"
 
msgstr "Адмін"
 

	
 
msgid "Disabled"
 
msgstr "Вимкнуто"
 

	
 
msgid "Allowed with manual account activation"
 
msgstr "Дозволено з ручною активацією облікового запису"
 

	
 
msgid "Allowed with automatic account activation"
 
msgstr "Дозволено з автоматичною активацію облікового запису"
 

	
 
msgid "Manual activation of external account"
 
msgstr "Ручна Активація зовнішнього акаунту"
 

	
 
msgid "Automatic activation of external account"
 
msgstr "Автоматична Активація зовнішнього акаунту"
 

	
 
msgid "Enabled"
 
msgstr "Увімкнено"
 

	
 
msgid "Global permissions updated successfully"
 
msgstr "Глобальні права успішно оновлено"
 

	
 
msgid "Error occurred during update of permissions"
 
msgstr "Сталася помилка під час оновлення прав"
 

	
 
msgid "Error occurred during creation of repository group %s"
 
msgstr "Сталася помилка при створенні repository group %s"
 

	
 
msgid "Created repository group %s"
 
msgstr "Створена група репозиторіїв %s"
 

	
 
msgid "Updated repository group %s"
 
msgstr "Оновлено групу репозиторіїв %s"
 

	
 
msgid "Error occurred during update of repository group %s"
 
msgstr "Сталася помилка при оновленні repository group %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 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"
 
msgstr "Сталася помилка під час додавання IP-адреси"
 

	
 
msgid "Removed IP address from user whitelist"
 
msgstr "Вилучено IP-адресу з білого списку користувачів"
 

	
 
msgid "You need to be a registered user to perform this action"
 
msgstr "Для виконання цієї дії потрібно бути зареєстрованим користувачем"
 

	
 
msgid "You need to be signed in to view this page"
 
msgstr "Ви повинні бути зареєстровані для перегляду цієї сторінки"
 

	
 
msgid ""
 
"CSRF token leak has been detected - all form tokens have been expired"
 
msgstr "Виявлено витік токенів CSRF - всі маркери форми минули"
 

	
 
msgid "Repository not found in the filesystem"
 
msgstr "Репозиторій не знайдено у файловій системі"
 

	
 
msgid "Changeset for %s %s not found in %s"
 
msgstr "Набір змін для %s %s не знайдено в %s"
 

	
 
msgid "Binary file"
 
msgstr "Двійковий файл"
 

	
 
msgid ""
 
"Changeset was too big and was cut off, use diff menu to display this diff"
 
msgstr ""
 
"Набір змін був занадто великий і було відрізано, використовуйте меню діфф "
 
"для показу цього порівняння"
 

	
 
msgid "No changes detected"
 
msgstr "Не виявлено змін"
 

	
 
msgid "Deleted branch: %s"
 
msgstr "Видалено гілку: %s"
 

	
 
msgid "Created tag: %s"
 
msgstr "Створено тег: %s"
 

	
 
msgid "Changeset %s not found"
 
msgstr "Набір змін %s не знайдено"
 

	
 
msgid "Show all combined changesets %s->%s"
 
msgstr "Показати всі комбіновані набори змін %s- >%s"
 

	
 
msgid "Compare view"
 
msgstr "Порівняйте вигляд"
 

	
 
msgid "and"
 
msgstr "і"
 

	
 
msgid "%s more"
 
msgstr "%s більше"
 

	
 
msgid "revisions"
 
msgstr "редакції"
 

	
 
msgid "Fork name %s"
 
msgstr "Ім'я розгалуження %s"
 

	
 
msgid "Pull request %s"
 
msgstr "Pull request %s"
 

	
 
msgid "[deleted] repository"
 
msgstr "[видалений] репозиторій"
 

	
 
msgid "[created] repository"
 
msgstr "[створено] репозиторій"
 

	
 
msgid "[created] repository as fork"
 
msgstr "[створено] репозиторій як fork"
 

	
 
msgid "[forked] repository"
 
msgstr "[forked] репозиторій"
 

	
 
msgid "[updated] repository"
 
msgstr "[оновлено] репозиторій"
 

	
 
msgid "[downloaded] archive from repository"
 
msgstr "[завантажити] архів з репозиторію"
 

	
 
msgid "[delete] repository"
 
msgstr "[видалити] репозиторій"
 

	
 
msgid "[created] user"
 
msgstr "[створено] користувач"
 

	
 
msgid "[updated] user"
 
msgstr "[оновлений] користувач"
 

	
 
msgid "[created] user group"
 
msgstr "[створено] групу користувачів"
 

	
 
msgid "[updated] user group"
 
msgstr "[оновлено] група користувачів"
 

	
 
@@ -1240,394 +1233,384 @@ msgstr ""
 
"можна витягнути з цієї URL-адреси."
 

	
 
msgid "Type name of user"
 
msgstr "Введіть ім'я користувача"
 

	
 
msgid "Change owner of this repository."
 
msgstr "Змінити власника цього сховища."
 

	
 
msgid "Processed commits"
 
msgstr "Оброблені коміти"
 

	
 
msgid "Processed progress"
 
msgstr "Оброблений прогрес"
 

	
 
msgid "Reset Statistics"
 
msgstr "Скинути статистику"
 

	
 
msgid "Confirm to remove current statistics."
 
msgstr "Підтвердьте видалення поточної статистики."
 

	
 
msgid "Repositories Administration"
 
msgstr "Адміністрування Репозиторіїв"
 

	
 
msgid "State"
 
msgstr "Стан"
 

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

	
 
msgid "VCS"
 
msgstr "VCS"
 

	
 
msgid "Remap and Rescan"
 
msgstr "Ремап та Рескан"
 

	
 
msgid "Visual"
 
msgstr "Візуальний"
 

	
 
msgid "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 "Set a custom title for your Kallithea Service."
 
msgstr "Встановіть власну назву для Сервісу Kallithea."
 

	
 
msgid "HTTP authentication realm"
 
msgstr "Область автентифікації HTTP"
 

	
 
msgid "HTML/JavaScript/CSS customization block"
 
msgstr "HTML/JavaScript/CSS блок налаштування"
 

	
 
msgid "ReCaptcha public key"
 
msgstr "ReCaptcha публічний ключ"
 

	
 
msgid "Public key for reCaptcha system."
 
msgstr "Публічний ключ для системи reCaptcha."
 

	
 
msgid "ReCaptcha private key"
 
msgstr "Приватний ключ ReCaptcha"
 

	
 
msgid ""
 
"Private key for reCaptcha system. Setting this value will enable captcha "
 
"on registration."
 
msgstr ""
 
"Приватний ключ для системи reCaptcha. Встановлення цього значення "
 
"дозволить вмикнути капчу при реєстрації."
 

	
 
msgid "Save Settings"
 
msgstr "Зберегти налаштування"
 

	
 
msgid "Built-in Mercurial Hooks (Read-Only)"
 
msgstr "Вбудовані хуки Mercurial (лише для читання)"
 

	
 
msgid "Custom Hooks"
 
msgstr "Користувацькі хуки"
 

	
 
msgid "Failed to remove hook"
 
msgstr "Не вдалося видалити хук"
 

	
 
msgid "Rescan options"
 
msgstr "Параметри пересканування"
 

	
 
msgid "Delete records of missing repositories"
 
msgstr "Видалення записів відсутніх репозиторіїв"
 

	
 
msgid ""
 
"Check this option to remove all comments, pull requests and other records "
 
"related to repositories that no longer exist in the filesystem."
 
msgstr ""
 
"Позначте цей пункт, щоб видалити всі коментарі, запити на пул-реквести та "
 
"інші записи, пов'язані з репозиторіями, які більше не існують в файловій "
 
"системі."
 

	
 
msgid "Invalidate cache for all repositories"
 
msgstr "Скинути кеш для всіх репозиторіїв"
 

	
 
msgid "Check this to reload data and clear cache keys for all repositories."
 
msgstr ""
 
"Відмітьте це, щоб перезавантажити дані і очистити ключі кешу для всіх "
 
"репозиторіїв."
 

	
 
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 "Форк"
 

	
 
msgid "Create Pull Request"
 
msgstr "Створити Pull-Запит"
 

	
 
msgid "Switch To"
 
msgstr "Переключитися на"
 

	
 
msgid "No matches found"
 
msgstr "Збігів не знайдено"
 

	
 
msgid "Show recent activity"
 
msgstr "Показати недавню активність"
 

	
 
msgid "Public journal"
 
msgstr "Публічний журнал"
 

	
 
msgid "Gists"
 
msgstr "Gists"
 

	
 
msgid "Search in repositories"
 
msgstr "Пошук в репозиторіях"
 

	
 
msgid "Login to Your Account"
 
msgstr "Увійти в свій аккаунт"
 

	
 
msgid "Forgot password?"
 
msgstr "Забули пароль?"
 

	
 
msgid "Don't have an account?"
 
msgstr "Не маєте облікового запису?"
 

	
 
msgid "Log Out"
 
msgstr "Вийти"
 

	
 
msgid "Create repositories"
 
msgstr "Створення репозиторіїв"
 

	
 
msgid "Create user groups"
 
msgstr "Створення груп користувачів"
 

	
 
msgid "Show"
 
msgstr "Показати"
 

	
 
msgid "No permissions defined yet"
 
msgstr "Ще не визначено жодних дозволів"
 

	
 
msgid "Permission"
 
msgstr "Права"
 

	
 
msgid "Edit Permission"
 
msgstr "Змінити права"
 

	
 
msgid "Retry"
 
msgstr "Повторити"
 

	
 
msgid "Submitting ..."
 
msgstr "Надсилання…"
 

	
 
msgid "Unable to post"
 
msgstr "Не вдається опублікувати"
 

	
 
msgid "Add Another Comment"
 
msgstr "Додати ще один коментар"
 

	
 
msgid "Group"
 
msgstr "Група"
 

	
 
msgid "Loading ..."
 
msgstr "Завантаження..."
 

	
 
msgid "loading ..."
 
msgstr "завантаження..."
 

	
 
msgid "Search truncated"
 
msgstr "Пошук усічений"
 

	
 
msgid "No matching files"
 
msgstr "Немає відповідних файлів"
 

	
 
msgid "Collapse Diff"
 
msgstr "Згорнути відмінності"
 

	
 
msgid "Expand Diff"
 
msgstr "Розгорнути відмінність"
 

	
 
msgid "No revisions"
 
msgstr "Немає змін"
 

	
 
msgid "Failed to revoke permission"
 
msgstr "Не вдалося відкликати дозвіл"
 

	
 
msgid "Select changeset"
 
msgstr "Виберіть набір змін"
 

	
 
msgid "Specify changeset"
 
msgstr "Укажіть набір змін"
 

	
kallithea/lib/db_manage.py
Show inline comments
 
@@ -78,265 +78,264 @@ class DbManage(object):
 
        If reuse_database is false, the database will be dropped (if it exists)
 
        and a new one created. If true, the existing database will be reused
 
        and cleaned for content.
 
        """
 
        url = sqlalchemy.engine.url.make_url(self.dburi)
 
        database = url.database
 
        if reuse_database:
 
            log.info("The content of the database %r will be destroyed and new tables created." % database)
 
        else:
 
            log.info("The existing database %r will be destroyed and a new one created." % database)
 

	
 
        if not self.tests:
 
            if not self._ask_ok('Are you sure to destroy old database? [y/n]'):
 
                print('Nothing done.')
 
                sys.exit(0)
 

	
 
        if reuse_database:
 
            Base.metadata.drop_all()
 
        else:
 
            if url.drivername == 'mysql':
 
                url.database = None  # don't connect to the database (it might not exist)
 
                engine = sqlalchemy.create_engine(url)
 
                with engine.connect() as conn:
 
                    conn.execute('DROP DATABASE IF EXISTS `%s`' % database)
 
                    conn.execute('CREATE DATABASE `%s` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci' % database)
 
            elif url.drivername == 'postgresql':
 
                from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
 
                url.database = 'postgres'  # connect to the system database (as the real one might not exist)
 
                engine = sqlalchemy.create_engine(url)
 
                with engine.connect() as conn:
 
                    conn.connection.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
 
                    conn.execute('DROP DATABASE IF EXISTS "%s"' % database)
 
                    conn.execute('CREATE DATABASE "%s"' % database)
 
            else:
 
                # Some databases enforce foreign key constraints and Base.metadata.drop_all() doesn't work, but this is
 
                # known to work on SQLite - possibly not on other databases with strong referential integrity
 
                Base.metadata.drop_all()
 

	
 
        Base.metadata.create_all(checkfirst=False)
 

	
 
        # Create an Alembic configuration and generate the version table,
 
        # "stamping" it with the most recent Alembic migration revision, to
 
        # tell Alembic that all the schema upgrades are already in effect.
 
        alembic_cfg = alembic.config.Config()
 
        alembic_cfg.set_main_option('script_location', 'kallithea:alembic')
 
        alembic_cfg.set_main_option('sqlalchemy.url', self.dburi)
 
        # This command will give an error in an Alembic multi-head scenario,
 
        # but in practice, such a scenario should not come up during database
 
        # creation, even during development.
 
        alembic.command.stamp(alembic_cfg, 'head')
 

	
 
        log.info('Created tables for %s', self.dbname)
 

	
 
    def admin_prompt(self, second=False):
 
        if not self.tests:
 
            import getpass
 

	
 
            username = self.cli_args.get('username')
 
            password = self.cli_args.get('password')
 
            email = self.cli_args.get('email')
 

	
 
            def get_password():
 
                password = getpass.getpass('Specify admin password '
 
                                           '(min 6 chars):')
 
                confirm = getpass.getpass('Confirm password:')
 

	
 
                if password != confirm:
 
                    log.error('passwords mismatch')
 
                    return False
 
                if len(password) < 6:
 
                    log.error('password is to short use at least 6 characters')
 
                    return False
 

	
 
                return password
 
            if username is None:
 
                username = input('Specify admin username:')
 
            if password is None:
 
                password = get_password()
 
                if not password:
 
                    # second try
 
                    password = get_password()
 
                    if not password:
 
                        sys.exit()
 
            if email is None:
 
                email = input('Specify admin email:')
 
            self.create_user(username, password, email, True)
 
        else:
 
            log.info('creating admin and regular test users')
 
            from kallithea.tests.base import (TEST_USER_ADMIN_EMAIL, TEST_USER_ADMIN_LOGIN, TEST_USER_ADMIN_PASS, TEST_USER_REGULAR2_EMAIL,
 
                                              TEST_USER_REGULAR2_LOGIN, TEST_USER_REGULAR2_PASS, TEST_USER_REGULAR_EMAIL, TEST_USER_REGULAR_LOGIN,
 
                                              TEST_USER_REGULAR_PASS)
 

	
 
            self.create_user(TEST_USER_ADMIN_LOGIN, TEST_USER_ADMIN_PASS,
 
                             TEST_USER_ADMIN_EMAIL, True)
 

	
 
            self.create_user(TEST_USER_REGULAR_LOGIN, TEST_USER_REGULAR_PASS,
 
                             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
 
@@ -48,405 +48,397 @@ from kallithea.lib.vcs.exceptions import
 
from kallithea.lib.vcs.utils.fakemod import create_module
 
from kallithea.lib.vcs.utils.helpers import get_scm
 
from kallithea.model import db, meta
 
from kallithea.model.db import RepoGroup, Repository, Setting, Ui, User, UserGroup, UserLog
 

	
 

	
 
log = logging.getLogger(__name__)
 

	
 
REMOVED_REPO_PAT = re.compile(r'rm__\d{8}_\d{6}_\d{6}_.*')
 

	
 

	
 
#==============================================================================
 
# PERM DECORATOR HELPERS FOR EXTRACTING NAMES FOR PERM CHECKS
 
#==============================================================================
 
def get_repo_slug(request):
 
    _repo = request.environ['pylons.routes_dict'].get('repo_name')
 
    if _repo:
 
        _repo = _repo.rstrip('/')
 
    return _repo
 

	
 

	
 
def get_repo_group_slug(request):
 
    _group = request.environ['pylons.routes_dict'].get('group_name')
 
    if _group:
 
        _group = _group.rstrip('/')
 
    return _group
 

	
 

	
 
def get_user_group_slug(request):
 
    _group = request.environ['pylons.routes_dict'].get('id')
 
    _group = UserGroup.get(_group)
 
    if _group:
 
        return _group.users_group_name
 
    return None
 

	
 

	
 
def _get_permanent_id(s):
 
    """Helper for decoding stable URLs with repo ID. For a string like '_123'
 
    return 123.
 
    """
 
    by_id_match = re.match(r'^_(\d+)$', s)
 
    if by_id_match is None:
 
        return None
 
    return int(by_id_match.group(1))
 

	
 

	
 
def fix_repo_id_name(path):
 
    """
 
    Rewrite repo_name for _<ID> permanent URLs.
 

	
 
    Given a path, if the first path element is like _<ID>, return the path with
 
    this part expanded to the corresponding full repo name, else return the
 
    provided path.
 
    """
 
    first, rest = path, ''
 
    if '/' in path:
 
        first, rest_ = path.split('/', 1)
 
        rest = '/' + rest_
 
    repo_id = _get_permanent_id(first)
 
    if repo_id is not None:
 
        repo = Repository.get(repo_id)
 
        if repo is not None:
 
            return repo.repo_name + rest
 
    return path
 

	
 

	
 
def action_logger(user, action, repo, ipaddr='', commit=False):
 
    """
 
    Action logger for various actions made by users
 

	
 
    :param user: user that made this action, can be a unique username string or
 
        object containing user_id attribute
 
    :param action: action to log, should be on of predefined unique actions for
 
        easy translations
 
    :param repo: string name of repository or object containing repo_id,
 
        that action was made on
 
    :param ipaddr: optional IP address from what the action was made
 

	
 
    """
 

	
 
    # if we don't get explicit IP address try to get one from registered user
 
    # in tmpl context var
 
    if not ipaddr:
 
        ipaddr = getattr(get_current_authuser(), 'ip_addr', '')
 

	
 
    if getattr(user, 'user_id', None):
 
        user_obj = User.get(user.user_id)
 
    elif isinstance(user, str):
 
        user_obj = User.get_by_username(user)
 
    else:
 
        raise Exception('You have to provide a user object or a username')
 

	
 
    if getattr(repo, 'repo_id', None):
 
        repo_obj = Repository.get(repo.repo_id)
 
        repo_name = repo_obj.repo_name
 
    elif isinstance(repo, str):
 
        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
 

	
 

	
 
def set_app_settings(config):
 
    """
 
    Updates app config with new settings from database
 

	
 
    :param config:
 
    """
 
    hgsettings = Setting.get_app_settings()
 
    for k, v in hgsettings.items():
 
        config[k] = v
 
    config['base_path'] = Ui.get_repos_location()
 

	
 

	
 
def set_vcs_config(config):
 
    """
 
    Patch VCS config with some Kallithea specific stuff
 

	
 
    :param config: kallithea.CONFIG
 
    """
 
    settings.BACKENDS = {
 
        'hg': 'kallithea.lib.vcs.backends.hg.MercurialRepository',
 
        'git': 'kallithea.lib.vcs.backends.git.GitRepository',
 
    }
 

	
 
    settings.GIT_EXECUTABLE_PATH = config.get('git_path', 'git')
 
    settings.GIT_REV_FILTER = config.get('git_rev_filter', '--all').strip()
 
    settings.DEFAULT_ENCODINGS = aslist(config.get('default_encoding',
 
                                                        'utf-8'), sep=',')
 

	
 

	
 
def set_indexer_config(config):
 
    """
 
    Update Whoosh index mapping
 

	
 
    :param config: kallithea.CONFIG
 
    """
 
    log.debug('adding extra into INDEX_EXTENSIONS')
 
    kallithea.config.conf.INDEX_EXTENSIONS.extend(re.split(r'\s+', config.get('index.extensions', '')))
 

	
 
    log.debug('adding extra into INDEX_FILENAMES')
 
    kallithea.config.conf.INDEX_FILENAMES.extend(re.split(r'\s+', config.get('index.filenames', '')))
 

	
 

	
 
def map_groups(path):
 
    """
 
    Given a full path to a repository, create all nested groups that this
 
    repo is inside. This function creates parent-child relationships between
 
    groups and creates default perms for all new groups.
 

	
 
    :param paths: full path to repository
 
    """
 
    from kallithea.model.repo_group import RepoGroupModel
 
    sa = meta.Session()
 
    groups = path.split(db.URL_SEP)
 
    parent = None
 
    group = None
 

	
 
    # last element is repo in nested groups structure
 
    groups = groups[:-1]
 
    rgm = RepoGroupModel()
 
    owner = User.get_first_admin()
 
    for lvl, group_name in enumerate(groups):
 
        group_name = '/'.join(groups[:lvl] + [group_name])
 
        group = RepoGroup.get_by_group_name(group_name)
 
        desc = '%s group' % group_name
 

	
 
        # skip folders that are now removed repos
 
        if REMOVED_REPO_PAT.match(group_name):
 
            break
 

	
 
        if group is None:
 
            log.debug('creating group level: %s group_name: %s',
 
                      lvl, group_name)
 
            group = RepoGroup(group_name, parent)
 
            group.group_description = desc
 
            group.owner = owner
 
            sa.add(group)
 
            rgm._create_default_perms(group)
 
            sa.flush()
 

	
 
        parent = group
 
    return group
 

	
 

	
 
def repo2db_mapper(initial_repo_dict, remove_obsolete=False,
 
                   install_git_hooks=False, user=None, overwrite_git_hooks=False):
 
    """
 
    maps all repos given in initial_repo_dict, non existing repositories
 
    are created, if remove_obsolete is True it also check for db entries
 
    that are not in initial_repo_dict and removes them.
 

	
 
    :param initial_repo_dict: mapping with repositories found by scanning methods
 
    :param remove_obsolete: check for obsolete entries in database
 
    :param install_git_hooks: if this is True, also check and install git hook
 
        for a repo if missing
 
    :param overwrite_git_hooks: if this is True, overwrite any existing git hooks
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):
 
        """
 
        Validates repository.
 
        """
 
        raise NotImplementedError
 

	
 
    def is_empty(self):
 
        return self._empty
 

	
 
    #==========================================================================
 
    # CHANGESETS
 
    #==========================================================================
 

	
 
    def get_changeset(self, revision=None):
 
        """
 
        Returns instance of ``Changeset`` class. If ``revision`` is None, most
 
        recent changeset is returned.
 

	
 
        :raises ``EmptyRepositoryError``: if there are no revisions
 
        """
 
        raise NotImplementedError
 

	
 
    def __iter__(self):
 
        """
 
        Allows Repository objects to be iterated.
 

	
 
        *Requires* implementation of ``__getitem__`` method.
 
        """
 
        for revision in self.revisions:
 
            yield self.get_changeset(revision)
 

	
 
    def get_changesets(self, start=None, end=None, start_date=None,
 
                       end_date=None, branch_name=None, reverse=False, max_revisions=None):
 
        """
 
        Returns iterator of ``BaseChangeset`` objects from start to end,
 
        both inclusive.
 

	
 
        :param start: None or str
 
        :param end: None or str
 
        :param start_date:
 
        :param end_date:
 
        :param branch_name:
 
        :param reversed:
 
        """
 
        raise NotImplementedError
 

	
 
    def __getitem__(self, key):
 
        if isinstance(key, slice):
 
            return (self.get_changeset(rev) for rev in self.revisions[key])
 
        return self.get_changeset(key)
 

	
 
    def count(self):
 
        return len(self.revisions)
 

	
 
    def tag(self, name, user, revision=None, message=None, date=None, **opts):
 
        """
 
        Creates and returns a tag for the given ``revision``.
 

	
 
        :param name: name for new tag
 
        :param user: full username, i.e.: "Joe Doe <joe.doe@example.com>"
 
        :param revision: changeset id for which new tag would be created
 
        :param message: message of the tag's commit
 
        :param date: date of tag's commit
 

	
 
        :raises TagAlreadyExistError: if tag with same name already exists
 
        """
 
        raise NotImplementedError
 

	
 
    def remove_tag(self, name, user, message=None, date=None):
 
        """
 
        Removes tag with the given ``name``.
 

	
 
        :param name: name of the tag to be removed
 
        :param user: full username, i.e.: "Joe Doe <joe.doe@example.com>"
 
        :param message: message of the tag's removal commit
 
        :param date: date of tag's removal commit
 

	
 
        :raises TagDoesNotExistError: if tag with given name does not exists
 
        """
 
        raise NotImplementedError
 

	
 
    def get_diff(self, rev1, rev2, path=None, ignore_whitespace=False,
 
            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``.
 
        """
 
        raise NotImplementedError
 

	
 
    # ========== #
 
    # COMMIT API #
 
    # ========== #
 

	
 
    @LazyProperty
 
    def in_memory_changeset(self):
 
        """
 
        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
 

	
 
    @LazyProperty
 
    def revision(self):
 
        """
 
        Returns integer identifying this changeset.
 

	
 
        """
 
        raise NotImplementedError
 

	
 
    @LazyProperty
 
    def committer(self):
 
        """
 
        Returns Committer for given commit
 
        """
 

	
 
        raise NotImplementedError
 

	
 
    @LazyProperty
 
    def committer_name(self):
 
        """
 
        Returns Author name for given commit
 
        """
 

	
 
        return author_name(self.committer)
 

	
 
    @LazyProperty
 
    def committer_email(self):
 
        """
 
        Returns Author email address for given commit
 
        """
 

	
 
        return author_email(self.committer)
 

	
 
    @LazyProperty
 
    def author(self):
 
        """
 
        Returns Author for given commit
 
        """
 

	
 
        raise NotImplementedError
 

	
 
    @LazyProperty
 
    def author_name(self):
 
        """
 
        Returns Author name for given commit
 
        """
 

	
 
        return author_name(self.author)
 

	
 
    @LazyProperty
 
    def author_email(self):
 
        """
 
        Returns Author email address for given commit
 
        """
 

	
 
        return author_email(self.author)
 

	
 
    def get_file_mode(self, path):
 
        """
 
        Returns stat mode of the file at the given ``path``.
 
        """
 
        raise NotImplementedError
 

	
 
    def get_file_content(self, path):
 
        """
 
        Returns content of the file at the given ``path``.
 
        """
 
        raise NotImplementedError
 

	
 
    def get_file_size(self, path):
 
        """
 
        Returns size of the file at the given ``path``.
 
        """
 
        raise NotImplementedError
 

	
 
    def get_file_changeset(self, path):
 
        """
 
        Returns last commit of the file at the given ``path``.
 
        """
 
        raise NotImplementedError
 

	
 
    def get_file_history(self, path):
 
        """
 
        Returns history of file as reversed list of ``Changeset`` objects for
 
        which file at given ``path`` has been modified.
 
        """
 
        raise NotImplementedError
 

	
 
    def get_nodes(self, path):
 
        """
 
        Returns combined ``DirNode`` and ``FileNode`` objects list representing
 
        state of changeset at the given ``path``.
 

	
 
        :raises ``ChangesetError``: if node at the given ``path`` is not
 
          instance of ``DirNode``
 
        """
kallithea/lib/vcs/backends/hg/repository.py
Show inline comments
 
@@ -146,385 +146,385 @@ class MercurialRepository(BaseRepository
 
        Gets tags for this repository
 
        """
 
        return self._get_tags()
 

	
 
    def _get_tags(self):
 
        if self._empty:
 
            return {}
 

	
 
        return OrderedDict(sorted(
 
            ((safe_str(n), ascii_str(mercurial.node.hex(h))) for n, h in self._repo.tags().items()),
 
            reverse=True,
 
            key=lambda x: x[0],  # sort by name
 
        ))
 

	
 
    def tag(self, name, user, revision=None, message=None, date=None,
 
            **kwargs):
 
        """
 
        Creates and returns a tag for the given ``revision``.
 

	
 
        :param name: name for new tag
 
        :param user: full username, i.e.: "Joe Doe <joe.doe@example.com>"
 
        :param revision: changeset id for which new tag would be created
 
        :param message: message of the tag's commit
 
        :param date: date of tag's commit
 

	
 
        :raises TagAlreadyExistError: if tag with same name already exists
 
        """
 
        if name in self.tags:
 
            raise TagAlreadyExistError("Tag %s already exists" % name)
 
        changeset = self.get_changeset(revision)
 
        local = kwargs.setdefault('local', False)
 

	
 
        if message is None:
 
            message = "Added tag %s for changeset %s" % (name,
 
                changeset.short_id)
 

	
 
        if date is None:
 
            date = safe_bytes(datetime.datetime.now().strftime('%a, %d %b %Y %H:%M:%S'))
 

	
 
        try:
 
            mercurial.tags.tag(self._repo, safe_bytes(name), changeset._ctx.node(), safe_bytes(message), local, safe_bytes(user), date)
 
        except mercurial.error.Abort as e:
 
            raise RepositoryError(e.args[0])
 

	
 
        # Reinitialize tags
 
        self.tags = self._get_tags()
 
        tag_id = self.tags[name]
 

	
 
        return self.get_changeset(revision=tag_id)
 

	
 
    def remove_tag(self, name, user, message=None, date=None):
 
        """
 
        Removes tag with the given ``name``.
 

	
 
        :param name: name of the tag to be removed
 
        :param user: full username, i.e.: "Joe Doe <joe.doe@example.com>"
 
        :param message: message of the tag's removal commit
 
        :param date: date of tag's removal commit
 

	
 
        :raises TagDoesNotExistError: if tag with given name does not exists
 
        """
 
        if name not in self.tags:
 
            raise TagDoesNotExistError("Tag %s does not exist" % name)
 
        if message is None:
 
            message = "Removed tag %s" % name
 
        if date is None:
 
            date = safe_bytes(datetime.datetime.now().strftime('%a, %d %b %Y %H:%M:%S'))
 
        local = False
 

	
 
        try:
 
            mercurial.tags.tag(self._repo, safe_bytes(name), mercurial.commands.nullid, safe_bytes(message), local, safe_bytes(user), date)
 
            self.tags = self._get_tags()
 
        except mercurial.error.Abort as e:
 
            raise RepositoryError(e.args[0])
 

	
 
    @LazyProperty
 
    def bookmarks(self):
 
        """
 
        Gets bookmarks for this repository
 
        """
 
        return self._get_bookmarks()
 

	
 
    def _get_bookmarks(self):
 
        if self._empty:
 
            return {}
 

	
 
        return OrderedDict(sorted(
 
            ((safe_str(n), ascii_str(mercurial.node.hex(h))) for n, h in self._repo._bookmarks.items()),
 
            reverse=True,
 
            key=lambda x: x[0],  # sort by name
 
        ))
 

	
 
    def _get_all_revisions(self):
 
        return [ascii_str(self._repo[x].hex()) for x in self._repo.filtered(b'visible').changelog.revs()]
 

	
 
    def get_diff(self, rev1, rev2, path='', ignore_whitespace=False,
 
                  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, ):
 
            msg = "Ambiguous identifier `%s` for %s" % (safe_str(revision), self.name)
 
            raise ChangesetDoesNotExistError(msg)
 

	
 
    def get_ref_revision(self, ref_type, ref_name):
 
        """
 
        Returns revision number for the given reference.
 
        """
 
        if ref_type == 'rev' and not ref_name.strip('0'):
 
            return self.EMPTY_CHANGESET
 
        # lookup up the exact node id
 
        _revset_predicates = {
 
                'branch': 'branch',
 
                'book': 'bookmark',
 
                'tag': 'tag',
 
                'rev': 'id',
 
            }
 
        # avoid expensive branch(x) iteration over whole repo
 
        rev_spec = "%%s & %s(%%s)" % _revset_predicates[ref_type]
 
        try:
 
            revs = self._repo.revs(rev_spec, ref_name, ref_name)
 
        except LookupError:
 
            msg = "Ambiguous identifier %s:%s for %s" % (ref_type, ref_name, self.name)
 
            raise ChangesetDoesNotExistError(msg)
 
        except mercurial.error.RepoLookupError:
 
            msg = "Revision %s:%s does not exist for %s" % (ref_type, ref_name, self.name)
 
            raise ChangesetDoesNotExistError(msg)
 
        if revs:
 
            revision = revs.last()
 
        else:
 
            # TODO: just report 'not found'?
 
            revision = ref_name
 

	
 
        return self._get_revision(revision)
 

	
 
    def _get_archives(self, archive_name='tip'):
 
        allowed = self.baseui.configlist(b"web", b"allow_archive",
 
                                         untrusted=True)
 
        for name, ext in [(b'zip', '.zip'), (b'gz', '.tar.gz'), (b'bz2', '.tar.bz2')]:
 
            if name in allowed or self._repo.ui.configbool(b"web",
 
                                                           b"allow" + name,
 
                                                           untrusted=True):
 
                yield {"type": safe_str(name), "extension": ext, "node": archive_name}
 

	
 
    def _get_url(self, url):
 
        """
 
        Returns normalized url. If schema is not given, fall back to
 
        filesystem (``file:///``) schema.
 
        """
 
        if url != 'default' and '://' not in url:
 
            url = "file:" + urllib.request.pathname2url(url)
 
        return url
 

	
 
    def get_changeset(self, revision=None):
 
        """
 
        Returns ``MercurialChangeset`` object representing repository's
 
        changeset at the given ``revision``.
 
        """
 
        return MercurialChangeset(repository=self, revision=self._get_revision(revision))
 

	
 
    def get_changesets(self, start=None, end=None, start_date=None,
 
                       end_date=None, branch_name=None, reverse=False, max_revisions=None):
 
        """
 
        Returns iterator of ``MercurialChangeset`` objects from start to end
 
        (both are inclusive)
 

	
 
        :param start: None, str, int or mercurial lookup format
 
        :param end:  None, str, int or mercurial lookup format
 
        :param start_date:
 
        :param end_date:
 
        :param branch_name:
 
        :param reversed: return changesets in reversed order
 
        """
 
        start_raw_id = self._get_revision(start)
 
        start_pos = None if start is None else self.revisions.index(start_raw_id)
 
        end_raw_id = self._get_revision(end)
 
        end_pos = None if end is None else self.revisions.index(end_raw_id)
 

	
 
        if start_pos is not None and end_pos is not None and start_pos > end_pos:
 
            raise RepositoryError("Start revision '%s' cannot be "
 
                                  "after end revision '%s'" % (start, end))
 

	
 
        if branch_name and branch_name not in self.allbranches:
 
            msg = "Branch %r not found in %s" % (branch_name, self.name)
 
            raise BranchDoesNotExistError(msg)
 
        if end_pos is not None:
 
            end_pos += 1
 
        # filter branches
 
        filter_ = []
 
        if branch_name:
 
            filter_.append(b'branch("%s")' % safe_bytes(branch_name))
 
        if start_date:
 
            filter_.append(b'date(">%s")' % safe_bytes(str(start_date)))
 
        if end_date:
 
            filter_.append(b'date("<%s")' % safe_bytes(str(end_date)))
 
        if filter_ or max_revisions:
 
            if filter_:
kallithea/lib/vcs/nodes.py
Show inline comments
 
@@ -398,209 +398,209 @@ class FileNode(Node):
 
    @LazyProperty
 
    def extension(self):
 
        """Returns filenode extension"""
 
        return self.name.split('.')[-1]
 

	
 
    @property
 
    def is_executable(self):
 
        """
 
        Returns ``True`` if file has executable flag turned on.
 
        """
 
        return bool(self.mode & stat.S_IXUSR)
 

	
 
    def __repr__(self):
 
        return '<%s %r @ %s>' % (self.__class__.__name__, self.path,
 
                                 getattr(self.changeset, 'short_id', ''))
 

	
 

	
 
class RemovedFileNode(FileNode):
 
    """
 
    Dummy FileNode class - trying to access any public attribute except path,
 
    name, kind or state (or methods/attributes checking those two) would raise
 
    RemovedFileNodeError.
 
    """
 
    ALLOWED_ATTRIBUTES = [
 
        'name', 'path', 'state', 'is_root', 'is_file', 'is_dir', 'kind',
 
        'added', 'changed', 'not_changed', 'removed'
 
    ]
 

	
 
    def __init__(self, path):
 
        """
 
        :param path: relative path to the node
 
        """
 
        super(RemovedFileNode, self).__init__(path=path)
 

	
 
    def __getattribute__(self, attr):
 
        if attr.startswith('_') or attr in RemovedFileNode.ALLOWED_ATTRIBUTES:
 
            return super(RemovedFileNode, self).__getattribute__(attr)
 
        raise RemovedFileNodeError("Cannot access attribute %s on "
 
            "RemovedFileNode" % attr)
 

	
 
    @LazyProperty
 
    def state(self):
 
        return NodeState.REMOVED
 

	
 

	
 
class DirNode(Node):
 
    """
 
    DirNode stores list of files and directories within this node.
 
    Nodes may be used standalone but within repository context they
 
    lazily fetch data within same repository's changeset.
 
    """
 

	
 
    def __init__(self, path, nodes=(), changeset=None):
 
        """
 
        Only one of ``nodes`` and ``changeset`` may be given. Passing both
 
        would raise ``NodeError`` exception.
 

	
 
        :param path: relative path to the node
 
        :param nodes: content may be passed to constructor
 
        :param changeset: if given, will use it to lazily fetch content
 
        :param size: always 0 for ``DirNode``
 
        """
 
        if nodes and changeset:
 
            raise NodeError("Cannot use both nodes and changeset")
 
        super(DirNode, self).__init__(path, NodeKind.DIR)
 
        self.changeset = changeset
 
        self._nodes = nodes
 

	
 
    def __eq__(self, other):
 
        eq = super(DirNode, self).__eq__(other)
 
        if eq is not None:
 
            return eq
 
        # check without entering each dir
 
        self_nodes_paths = list(sorted(n.path for n in self.nodes))
 
        other_nodes_paths = list(sorted(n.path for n in self.nodes))
 
        return self_nodes_paths == other_nodes_paths
 

	
 
    def __lt__(self, other):
 
        lt = super(DirNode, self).__lt__(other)
 
        if lt is not None:
 
            return lt
 
        # check without entering each dir
 
        self_nodes_paths = list(sorted(n.path for n in self.nodes))
 
        other_nodes_paths = list(sorted(n.path for n in self.nodes))
 
        return self_nodes_paths < other_nodes_paths
 

	
 
    @LazyProperty
 
    def nodes(self):
 
        if self.changeset:
 
            nodes = self.changeset.get_nodes(self.path)
 
        else:
 
            nodes = self._nodes
 
        self._nodes_dict = dict((node.path, node) for node in nodes)
 
        return sorted(nodes)
 

	
 
    @LazyProperty
 
    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))
 
        )
 

	
 
    @classmethod
 
    def get_or_404(cls, id_):
 
        try:
 
            id_ = int(id_)
 
        except (TypeError, ValueError):
 
            raise HTTPNotFound
 

	
 
        res = cls.query().get(id_)
 
        if res is None:
 
            raise HTTPNotFound
 
        return res
 

	
 
    @classmethod
 
    def delete(cls, id_):
 
        obj = cls.query().get(id_)
 
        Session().delete(obj)
 

	
 
    def __repr__(self):
 
        return '<DB:%s>' % (self.__class__.__name__)
 

	
 

	
 
_table_args_default_dict = {'extend_existing': True,
 
                            'mysql_engine': 'InnoDB',
 
                            'sqlite_autoincrement': True,
 
                           }
 

	
 
class Setting(Base, BaseDbModel):
 
    __tablename__ = 'settings'
 
    __table_args__ = (
 
        _table_args_default_dict,
 
    )
 

	
 
    SETTINGS_TYPES = {
 
        'str': safe_bytes,
 
        'int': safe_int,
 
        'unicode': safe_str,
 
        'bool': asbool,
 
        'list': functools.partial(aslist, sep=',')
 
    }
 

	
 
    app_settings_id = Column(Integer(), primary_key=True)
 
    app_settings_name = Column(String(255), nullable=False, unique=True)
 
    _app_settings_value = Column("app_settings_value", Unicode(4096), nullable=False)
 
    _app_settings_type = Column("app_settings_type", String(255), nullable=True) # FIXME: not nullable?
 

	
 
    def __init__(self, key='', val='', type='unicode'):
 
        self.app_settings_name = key
 
        self.app_settings_value = val
 
        self.app_settings_type = type
 

	
 
    @validates('_app_settings_value')
 
    def validate_settings_value(self, key, val):
 
        assert isinstance(val, str)
 
        return val
 

	
 
    @hybrid_property
 
    def app_settings_value(self):
 
        v = self._app_settings_value
 
        _type = self.app_settings_type
 
        converter = self.SETTINGS_TYPES.get(_type) or self.SETTINGS_TYPES['unicode']
 
        return converter(v)
 

	
 
    @app_settings_value.setter
 
    def app_settings_value(self, val):
 
        """
 
        Setter that will always make sure we use str in app_settings_value
 
        """
 
        self._app_settings_value = safe_str(val)
 

	
 
    @hybrid_property
 
    def app_settings_type(self):
 
        return self._app_settings_type
 

	
 
    @app_settings_type.setter
 
    def app_settings_type(self, val):
 
        if val not in self.SETTINGS_TYPES:
 
            raise Exception('type must be one of %s got %s'
 
                            % (list(self.SETTINGS_TYPES), val))
 
        self._app_settings_type = val
 

	
 
    def __repr__(self):
 
        return "<%s %s.%s=%r>" % (
 
            self.__class__.__name__,
 
            self.app_settings_name, self.app_settings_type, self.app_settings_value
 
        )
 

	
 
    @classmethod
 
    def get_by_name(cls, key):
 
        return cls.query() \
 
            .filter(cls.app_settings_name == key).scalar()
 

	
 
    @classmethod
 
    def get_by_name_or_create(cls, key, val='', type='unicode'):
 
        res = cls.get_by_name(key)
 
        if res is None:
 
            res = cls(key, val, type)
kallithea/model/forms.py
Show inline comments
 
@@ -199,367 +199,366 @@ def RegisterForm(edit=False, old_data=No
 
            v.ValidPassword(),
 
            v.UnicodeString(strip=False, min=6, not_empty=True)
 
        )
 
        password_confirmation = All(
 
            v.ValidPassword(),
 
            v.UnicodeString(strip=False, min=6, not_empty=True)
 
        )
 
        active = v.StringBoolean(if_missing=False)
 
        firstname = v.UnicodeString(strip=True, min=1, not_empty=False)
 
        lastname = v.UnicodeString(strip=True, min=1, not_empty=False)
 
        email = All(v.Email(not_empty=True), v.UniqSystemEmail(old_data))
 

	
 
        chained_validators = [v.ValidPasswordsMatch('password',
 
                                                    'password_confirmation')]
 

	
 
    return _RegisterForm
 

	
 

	
 
def PasswordResetRequestForm():
 
    class _PasswordResetRequestForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = True
 
        email = v.Email(not_empty=True)
 
    return _PasswordResetRequestForm
 

	
 

	
 
def PasswordResetConfirmationForm():
 
    class _PasswordResetConfirmationForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = True
 

	
 
        email = v.UnicodeString(strip=True, not_empty=True)
 
        timestamp = v.Number(strip=True, not_empty=True)
 
        token = v.UnicodeString(strip=True, not_empty=True)
 
        password = All(v.ValidPassword(), v.UnicodeString(strip=False, min=6))
 
        password_confirm = All(v.ValidPassword(), v.UnicodeString(strip=False, min=6))
 

	
 
        chained_validators = [v.ValidPasswordsMatch('password',
 
                                                    'password_confirm')]
 
    return _PasswordResetConfirmationForm
 

	
 

	
 
def RepoForm(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 _RepoForm(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(old_data),
 
                         v.OneOf(repo_group_ids, hideList=True),
 
                         v.Int(min=-1, not_empty=True))
 
        repo_type = v.OneOf(supported_backends, required=False,
 
                            if_missing=old_data.get('repo_type'))
 
        repo_description = v.UnicodeString(strip=True, min=1, not_empty=False)
 
        repo_private = v.StringBoolean(if_missing=False)
 
        repo_landing_rev = v.OneOf(landing_revs, hideList=True)
 
        repo_copy_permissions = v.StringBoolean(if_missing=False)
 
        clone_uri = All(v.UnicodeString(strip=True, min=1, not_empty=False))
 

	
 
        repo_enable_statistics = v.StringBoolean(if_missing=False)
 
        repo_enable_downloads = v.StringBoolean(if_missing=False)
 

	
 
        if edit:
 
            owner = All(v.UnicodeString(not_empty=True), v.ValidRepoUser())
 
            # Not a real field - just for reference for validation:
 
            # clone_uri_hidden = v.UnicodeString(if_missing='')
 

	
 
        chained_validators = [v.ValidCloneUri(),
 
                              v.ValidRepoName(edit, old_data)]
 
    return _RepoForm
 

	
 

	
 
def RepoPermsForm():
 
    class _RepoPermsForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = False
 
        chained_validators = [v.ValidPerms(type_='repo')]
 
    return _RepoPermsForm
 

	
 

	
 
def RepoGroupPermsForm(valid_recursive_choices):
 
    class _RepoGroupPermsForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = False
 
        recursive = v.OneOf(valid_recursive_choices)
 
        chained_validators = [v.ValidPerms(type_='repo_group')]
 
    return _RepoGroupPermsForm
 

	
 

	
 
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
 
        #pre_validators = [LdapLibValidator]
 
        ldap_active = v.StringBoolean(if_missing=False)
 
        ldap_host = v.UnicodeString(strip=True,)
 
        ldap_port = v.Number(strip=True,)
 
        ldap_tls_kind = v.OneOf(tls_kind_choices)
 
        ldap_tls_reqcert = v.OneOf(tls_reqcert_choices)
 
        ldap_dn_user = v.UnicodeString(strip=True,)
 
        ldap_dn_pass = v.UnicodeString(strip=True,)
 
        ldap_base_dn = v.UnicodeString(strip=True,)
 
        ldap_filter = v.UnicodeString(strip=True,)
 
        ldap_search_scope = v.OneOf(search_scope_choices)
 
        ldap_attr_login = v.AttrLoginValidator()(not_empty=True)
 
        ldap_attr_firstname = v.UnicodeString(strip=True,)
 
        ldap_attr_lastname = v.UnicodeString(strip=True,)
 
        ldap_attr_email = v.UnicodeString(strip=True,)
 

	
 
    return _LdapSettingsForm
 

	
 

	
 
def UserExtraEmailForm():
 
    class _UserExtraEmailForm(formencode.Schema):
 
        email = All(v.UniqSystemEmail(), v.Email(not_empty=True))
 
    return _UserExtraEmailForm
 

	
 

	
 
def UserExtraIpForm():
 
    class _UserExtraIpForm(formencode.Schema):
 
        ip = v.ValidIp()(not_empty=True)
 
    return _UserExtraIpForm
 

	
 

	
 
def PullRequestForm(repo_id):
 
    class _PullRequestForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = True
 

	
 
        org_repo = v.UnicodeString(strip=True, required=True)
 
        org_ref = v.UnicodeString(strip=True, required=True)
 
        other_repo = v.UnicodeString(strip=True, required=True)
 
        other_ref = v.UnicodeString(strip=True, required=True)
 

	
 
        pullrequest_title = v.UnicodeString(strip=True, required=True)
 
        pullrequest_desc = v.UnicodeString(strip=True, required=False)
 

	
 
    return _PullRequestForm
 

	
 

	
 
def PullRequestPostForm():
 
    class _PullRequestPostForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = True
 

	
 
        pullrequest_title = v.UnicodeString(strip=True, required=True)
 
        pullrequest_desc = v.UnicodeString(strip=True, required=False)
 
        org_review_members = v.Set()
 
        review_members = v.Set()
 
        updaterev = v.UnicodeString(strip=True, required=False, if_missing=None)
 
        owner = All(v.UnicodeString(strip=True, required=True),
 
                    v.ValidRepoUser())
 

	
 
    return _PullRequestPostForm
 

	
 

	
 
def GistForm(lifetime_options):
 
    class _GistForm(formencode.Schema):
 
        allow_extra_fields = True
 
        filter_extra_fields = True
 

	
 
        filename = All(v.BasePath()(),
 
                       v.UnicodeString(strip=True, required=False))
 
        description = v.UnicodeString(required=False, if_missing='')
 
        lifetime = v.OneOf(lifetime_options)
 
        mimetype = v.UnicodeString(required=False, if_missing=None)
 
        content = v.UnicodeString(required=True, not_empty=True)
 
        public = v.UnicodeString(required=False, if_missing='')
 
        private = v.UnicodeString(required=False, if_missing='')
 

	
 
    return _GistForm
kallithea/model/validators.py
Show inline comments
 
@@ -211,385 +211,385 @@ def ValidRepoGroup(edit=False, old_data=
 
                    )
 

	
 
                # check for same repo
 
                repo = Repository.query() \
 
                      .filter(func.lower(Repository.repo_name) == func.lower(slug)) \
 
                      .scalar()
 
                if repo is not None:
 
                    msg = self.message('repo_exists', state, group_name=slug)
 
                    raise formencode.Invalid(msg, value, state,
 
                            error_dict=dict(group_name=msg)
 
                    )
 

	
 
    return _validator
 

	
 

	
 
def ValidPassword():
 
    class _validator(formencode.validators.FancyValidator):
 
        messages = {
 
            'invalid_password':
 
                _('Invalid characters (non-ascii) in password')
 
        }
 

	
 
        def _validate_python(self, value, state):
 
            try:
 
                (value or '').encode('ascii')
 
            except UnicodeError:
 
                msg = self.message('invalid_password', state)
 
                raise formencode.Invalid(msg, value, state,)
 
    return _validator
 

	
 

	
 
def ValidOldPassword(username):
 
    class _validator(formencode.validators.FancyValidator):
 
        messages = {
 
            'invalid_password': _('Invalid old password')
 
        }
 

	
 
        def _validate_python(self, value, state):
 
            from kallithea.lib import auth_modules
 
            if auth_modules.authenticate(username, value, '') is None:
 
                msg = self.message('invalid_password', state)
 
                raise formencode.Invalid(msg, value, state,
 
                    error_dict=dict(current_password=msg)
 
                )
 
    return _validator
 

	
 

	
 
def ValidPasswordsMatch(password_field, password_confirmation_field):
 
    class _validator(formencode.validators.FancyValidator):
 
        messages = {
 
            'password_mismatch': _('Passwords do not match'),
 
        }
 

	
 
        def _validate_python(self, value, state):
 
            if value.get(password_field) != value[password_confirmation_field]:
 
                msg = self.message('password_mismatch', state)
 
                raise formencode.Invalid(msg, value, state,
 
                     error_dict={password_field: msg, password_confirmation_field: msg}
 
                )
 
    return _validator
 

	
 

	
 
def ValidAuth():
 
    class _validator(formencode.validators.FancyValidator):
 
        messages = {
 
            'invalid_auth': _('Invalid username or password'),
 
        }
 

	
 
        def _validate_python(self, value, state):
 
            from kallithea.lib import auth_modules
 

	
 
            password = value['password']
 
            username = value['username']
 

	
 
            # authenticate returns unused dict but has called
 
            # plugin._authenticate which has create_or_update'ed the username user in db
 
            if auth_modules.authenticate(username, password) is None:
 
                user = User.get_by_username_or_email(username)
 
                if user and not user.active:
 
                    log.warning('user %s is disabled', username)
 
                    msg = self.message('invalid_auth', state)
 
                    raise formencode.Invalid(msg, value, state,
 
                        error_dict=dict(username=' ', password=msg)
 
                    )
 
                else:
 
                    log.warning('user %s failed to authenticate', username)
 
                    msg = self.message('invalid_auth', state)
 
                    raise formencode.Invalid(msg, value, state,
 
                        error_dict=dict(username=' ', password=msg)
 
                    )
 
    return _validator
 

	
 

	
 
def ValidRepoName(edit=False, old_data=None):
 
    old_data = old_data or {}
 

	
 
    class _validator(formencode.validators.FancyValidator):
 
        messages = {
 
            'invalid_repo_name':
 
                _('Repository name %(repo)s is not allowed'),
 
            'repository_exists':
 
                _('Repository named %(repo)s already exists'),
 
            'repository_in_group_exists': _('Repository "%(repo)s" already '
 
                                            'exists in group "%(group)s"'),
 
            'same_group_exists': _('Repository group with name "%(repo)s" '
 
                                   'already exists')
 
        }
 

	
 
        def _convert_to_python(self, value, state):
 
            repo_name = repo_name_slug(value.get('repo_name', ''))
 
            repo_group = value.get('repo_group')
 
            if repo_group:
 
                gr = RepoGroup.get(repo_group)
 
                group_path = gr.full_path
 
                group_name = gr.group_name
 
                # value needs to be aware of group name in order to check
 
                # db key This is an actual just the name to store in the
 
                # database
 
                repo_name_full = group_path + db.URL_SEP + repo_name
 
            else:
 
                group_name = group_path = ''
 
                repo_name_full = repo_name
 

	
 
            value['repo_name'] = repo_name
 
            value['repo_name_full'] = repo_name_full
 
            value['group_path'] = group_path
 
            value['group_name'] = group_name
 
            return value
 

	
 
        def _validate_python(self, value, state):
 
            repo_name = value.get('repo_name')
 
            repo_name_full = value.get('repo_name_full')
 
            group_path = value.get('group_path')
 
            group_name = value.get('group_name')
 

	
 
            if repo_name in [ADMIN_PREFIX, '']:
 
                msg = self.message('invalid_repo_name', state, repo=repo_name)
 
                raise formencode.Invalid(msg, value, state,
 
                    error_dict=dict(repo_name=msg)
 
                )
 

	
 
            rename = old_data.get('repo_name') != repo_name_full
 
            create = not edit
 
            if rename or create:
 
                repo = Repository.get_by_repo_name(repo_name_full, case_insensitive=True)
 
                repo_group = RepoGroup.get_by_group_name(repo_name_full, case_insensitive=True)
 
                if group_path != '':
 
                    if repo is not None:
 
                        msg = self.message('repository_in_group_exists', state,
 
                                repo=repo.repo_name, group=group_name)
 
                        raise formencode.Invalid(msg, value, state,
 
                            error_dict=dict(repo_name=msg)
 
                        )
 
                elif repo_group is not None:
 
                    msg = self.message('same_group_exists', state,
 
                            repo=repo_name)
 
                    raise formencode.Invalid(msg, value, state,
 
                        error_dict=dict(repo_name=msg)
 
                    )
 
                elif repo is not None:
 
                    msg = self.message('repository_exists', state,
 
                            repo=repo.repo_name)
 
                    raise formencode.Invalid(msg, value, state,
 
                        error_dict=dict(repo_name=msg)
 
                    )
 
            return value
 
    return _validator
 

	
 

	
 
def ValidForkName(*args, **kwargs):
 
    return ValidRepoName(*args, **kwargs)
 

	
 

	
 
def SlugifyName():
 
    class _validator(formencode.validators.FancyValidator):
 

	
 
        def _convert_to_python(self, value, state):
 
            return repo_name_slug(value)
 

	
 
        def _validate_python(self, value, state):
 
            pass
 

	
 
    return _validator
 

	
 

	
 
def ValidCloneUri():
 
    from kallithea.lib.utils import make_ui
 

	
 
    class _validator(formencode.validators.FancyValidator):
 
        messages = {
 
            'clone_uri': _('Invalid repository URL'),
 
            'invalid_clone_uri': _('Invalid repository URL. It must be a '
 
                                   'valid http, https, ssh, svn+http or svn+https URL'),
 
                                   'valid http, https, or ssh URL'),
 
        }
 

	
 
        def _validate_python(self, value, state):
 
            repo_type = value.get('repo_type')
 
            url = value.get('clone_uri')
 

	
 
            if url and url != value.get('clone_uri_hidden'):
 
                try:
 
                    is_valid_repo_uri(repo_type, url, make_ui())
 
                except InvalidCloneUriException as e:
 
                    log.warning('validation of clone URL %r failed: %s', url, e)
 
                    msg = self.message('clone_uri', state)
 
                    raise formencode.Invalid(msg, value, state,
 
                        error_dict=dict(clone_uri=msg)
 
                    )
 
    return _validator
 

	
 

	
 
def ValidForkType(old_data=None):
 
    old_data = old_data or {}
 

	
 
    class _validator(formencode.validators.FancyValidator):
 
        messages = {
 
            'invalid_fork_type': _('Fork has to be the same type as parent')
 
        }
 

	
 
        def _validate_python(self, value, state):
 
            if old_data['repo_type'] != value:
 
                msg = self.message('invalid_fork_type', state)
 
                raise formencode.Invalid(msg, value, state,
 
                    error_dict=dict(repo_type=msg)
 
                )
 
    return _validator
 

	
 

	
 
def CanWriteGroup(old_data=None):
 
    class _validator(formencode.validators.FancyValidator):
 
        messages = {
 
            'permission_denied': _("You don't have permissions "
 
                                   "to create repository in this group"),
 
            'permission_denied_root': _("no permission to create repository "
 
                                        "in root location")
 
        }
 

	
 
        def _convert_to_python(self, value, state):
 
            # root location
 
            if value == -1:
 
                return None
 
            return value
 

	
 
        def _validate_python(self, value, state):
 
            gr = RepoGroup.get(value)
 
            gr_name = gr.group_name if gr is not None else None # None means ROOT location
 

	
 
            # create repositories with write permission on group is set to true
 
            group_admin = HasRepoGroupPermissionLevel('admin')(gr_name,
 
                                            'can write into group validator')
 
            group_write = HasRepoGroupPermissionLevel('write')(gr_name,
 
                                            'can write into group validator')
 
            forbidden = not (group_admin or group_write)
 
            can_create_repos = HasPermissionAny('hg.admin', 'hg.create.repository')
 
            gid = (old_data['repo_group'].get('group_id')
 
                   if (old_data and 'repo_group' in old_data) else None)
 
            value_changed = gid != value
 
            new = not old_data
 
            # do check if we changed the value, there's a case that someone got
 
            # revoked write permissions to a repository, he still created, we
 
            # don't need to check permission if he didn't change the value of
 
            # groups in form box
 
            if value_changed or new:
 
                # parent group need to be existing
 
                if gr and forbidden:
 
                    msg = self.message('permission_denied', state)
 
                    raise formencode.Invalid(msg, value, state,
 
                        error_dict=dict(repo_type=msg)
 
                    )
 
                ## check if we can write to root location !
 
                elif gr is None and not can_create_repos():
 
                    msg = self.message('permission_denied_root', state)
 
                    raise formencode.Invalid(msg, value, state,
 
                        error_dict=dict(repo_type=msg)
 
                    )
 

	
 
    return _validator
 

	
 

	
 
def CanCreateGroup(can_create_in_root=False):
 
    class _validator(formencode.validators.FancyValidator):
 
        messages = {
 
            'permission_denied': _("You don't have permissions "
 
                                   "to create a group in this location")
 
        }
 

	
 
        def to_python(self, value, state):
 
            # root location
 
            if value == -1:
 
                return None
 
            return value
 

	
 
        def _validate_python(self, value, state):
 
            gr = RepoGroup.get(value)
 
            gr_name = gr.group_name if gr is not None else None # None means ROOT location
 

	
 
            if can_create_in_root and gr is None:
 
                # we can create in root, we're fine no validations required
 
                return
 

	
 
            forbidden_in_root = gr is None and not can_create_in_root
 
            forbidden = not HasRepoGroupPermissionLevel('admin')(gr_name, 'can create group validator')
 
            if forbidden_in_root or forbidden:
 
                msg = self.message('permission_denied', state)
 
                raise formencode.Invalid(msg, value, state,
 
                    error_dict=dict(parent_group_id=msg)
 
                )
 

	
 
    return _validator
 

	
 

	
 
def ValidPerms(type_='repo'):
 
    if type_ == 'repo_group':
 
        EMPTY_PERM = 'group.none'
 
    elif type_ == 'repo':
 
        EMPTY_PERM = 'repository.none'
 
    elif type_ == 'user_group':
 
        EMPTY_PERM = 'usergroup.none'
 

	
 
    class _validator(formencode.validators.FancyValidator):
 
        messages = {
 
            'perm_new_member_name':
 
                _('This username or user group name is not valid')
 
        }
 

	
 
        def to_python(self, value, state):
 
            perms_update = OrderedSet()
 
            perms_new = OrderedSet()
 
            # build a list of permission to update and new permission to create
 

	
 
            # CLEAN OUT ORG VALUE FROM NEW MEMBERS, and group them using
 
            new_perms_group = defaultdict(dict)
 
            for k, v in value.copy().items():
 
                if k.startswith('perm_new_member'):
 
                    del value[k]
 
                    _type, part = k.split('perm_new_member_')
 
                    args = part.split('_')
 
                    if len(args) == 1:
 
                        new_perms_group[args[0]]['perm'] = v
 
                    elif len(args) == 2:
 
                        _key, pos = args
 
                        new_perms_group[pos][_key] = v
 

	
 
            # fill new permissions in order of how they were added
 
            for k in sorted(new_perms_group, key=lambda k: int(k)):
 
                perm_dict = new_perms_group[k]
 
                new_member = perm_dict.get('name')
 
                new_perm = perm_dict.get('perm')
 
                new_type = perm_dict.get('type')
 
                if new_member and new_perm and new_type:
 
                    perms_new.add((new_member, new_perm, new_type))
 

	
 
            for k, v in value.items():
 
                if k.startswith('u_perm_') or k.startswith('g_perm_'):
 
                    member_name = k[7:]
 
                    t = {'u': 'user',
 
                         'g': 'users_group'
 
                    }[k[0]]
 
                    if member_name == User.DEFAULT_USER_NAME:
 
                        if asbool(value.get('repo_private')):
 
                            # set none for default when updating to
 
                            # private repo protects against form manipulation
 
                            v = EMPTY_PERM
 
                    perms_update.add((member_name, v, t))
 

	
 
            value['perms_updates'] = list(perms_update)
 
            value['perms_new'] = list(perms_new)
 

	
 
            # update permissions
 
            for k, v, t in perms_new:
 
                try:
 
                    if t == 'user':
 
                        _user_db = User.query() \
 
                            .filter(User.active == True) \
 
                            .filter(User.username == k).one()
 
                    if t == 'users_group':
 
                        _user_db = UserGroup.query() \
 
                            .filter(UserGroup.users_group_active == True) \
 
                            .filter(UserGroup.users_group_name == k).one()
 

	
 
                except Exception as e:
 
                    log.warning('Error validating %s permission %s', t, k)
 
                    msg = self.message('perm_new_member_type', state)
 
                    raise formencode.Invalid(msg, value, state,
 
                        error_dict=dict(perm_new_member_name=msg)
kallithea/templates/admin/settings/settings_vcs.html
Show inline comments
 
${h.form(url('admin_settings'), method='post')}
 
    <div class="form">
 
            <div class="form-group">
 
                <label class="control-label">${_('Hooks')}:</label>
 
                <div>
 
                    <div class="checkbox">
 
                        <label>
 
                            ${h.checkbox('hooks_changegroup_repo_size','True')}
 
                            ${_('Show repository size after push')}
 
                        </label>
 
                    </div>
 
                    <div class="checkbox">
 
                        <label>
 
                            ${h.checkbox('hooks_changegroup_update','True')}
 
                            ${_('Update repository after push (hg update)')}
 
                        </label>
 
                    </div>
 
                </div>
 
            </div>
 
            <div class="form-group">
 
                <label class="control-label">${_('Mercurial extensions')}:</label>
 
                <div>
 
                    <div class="checkbox">
 
                        <label>
 
                            ${h.checkbox('extensions_largefiles','True')}
 
                            ${_('Enable largefiles extension')}
 
                        </label>
 
                    </div>
 
                    <div class="checkbox">
 
                        <label>
 
                            ${h.checkbox('extensions_hgsubversion','True')}
 
                            ${_('Enable hgsubversion extension')}
 
                        </label>
 
                    </div>
 
                    <span class="help-block">${_('Requires hgsubversion library to be installed. Enables cloning of remote Subversion repositories while converting them to Mercurial.')}</span>
 
                    ##<div class="checkbox">
 
                    ##    <label>
 
                    ##        ${h.checkbox('extensions_hggit','True')}
 
                    ##        ${_('Enable hg-git extension')}
 
                    ##    </label>
 
                    ##</div>
 
                    ##<span class="help-block">${_('Requires hg-git library to be installed. Enables cloning of remote Git repositories while converting them to Mercurial.')}</span>
 
                </div>
 
            </div>
 
            %if c.visual.allow_repo_location_change:
 
            <div class="form-group">
 
                <label class="control-label" for="paths_root_path">${_('Location of repositories')}:</label>
 
                <div>
 
                    <div class="input-group">
 
                        ${h.text('paths_root_path',size=60,readonly="readonly",class_='form-control')}
 
                        <span id="path_unlock" data-toggle="tooltip" class="input-group-btn"
 
                            title="${_('Click to unlock. You must restart Kallithea in order to make this setting take effect.')}">
 
                            <button type="button" class="btn btn-default btn-sm"><i id="path_unlock_icon" class="icon-lock"></i></button>
 
                        </span>
 
                    </div>
 
                    <span class="help-block">${_('Filesystem location where repositories are stored. After changing this value, a restart and rescan of the repository folder are both required.')}</span>
 
                </div>
 
            </div>
 
            %else:
 
            ## form still requires this but we cannot internally change it anyway
 
            ${h.hidden('paths_root_path',size=30,readonly="readonly")}
 
            %endif
 
            <div class="form-group">
 
                <div class="buttons">
 
                    ${h.submit('save',_('Save Settings'),class_="btn btn-default")}
 
                    ${h.reset('reset',_('Reset'),class_="btn btn-default")}
 
                </div>
 
           </div>
 
    </div>
 
    ${h.end_form()}
 

	
 
    <script>'use strict';
 
        $(document).ready(function(){
 
            $('#path_unlock').on('click', function(){
 
                $('#path_unlock_icon').removeClass('icon-lock');
 
                $('#path_unlock_icon').addClass('icon-lock-open-alt');
 
                $('#paths_root_path').removeAttr('readonly');
 
            });
 
        });
 
    </script>
0 comments (0 inline, 0 general)