diff --git a/.travis.yml b/.travis.yml --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,10 @@ env: - TEST_DB=mysql://root@127.0.0.1/rhodecode_test - TEST_DB=postgresql://postgres@127.0.0.1/rhodecode_test +services: + - mysql + - postgresql + # command to install dependencies before_script: - mysql -e 'create database rhodecode_test;' diff --git a/CONTRIBUTORS b/CONTRIBUTORS --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -23,4 +23,5 @@ List of contributors to RhodeCode projec Takumi IINO Indra Talip James Rhodes - Dominik Ruf \ No newline at end of file + Dominik Ruf + xpol \ No newline at end of file diff --git a/development.ini b/development.ini --- a/development.ini +++ b/development.ini @@ -69,6 +69,8 @@ use_gravatar = true ## {email} user email ## {md5email} md5 hash of the user email (like at gravatar.com) ## {size} size of the image that is expected from the server application +## {scheme} http/https from RhodeCode server +## {netloc} network location from RhodeCode server #alternative_gravatar_url = http://myavatarserver.com/getbyemail/{email}/{size} #alternative_gravatar_url = http://myavatarserver.com/getbymd5/{md5email}?s={size} diff --git a/docs/changelog.rst b/docs/changelog.rst --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,11 +5,32 @@ Changelog ========= -1.4.1 (**2012-09-07**) +1.4.2 (**2012-09-12**) ---------------------- -:status: in-progress -:branch: beta +news +++++ + +- added option to menu to quick lock/unlock repository for users that have + write access to +- Implemented permissions for writing to repo + groups. Now only write access to group allows to create a repostiory + within that group +- #565 Add support for {netloc} and {scheme} to alternative_gravatar_url +- updated translation for zh_CN + +fixes ++++++ + +- fixed visual permissions check on repos groups inside groups +- fixed issues with non-ascii search terms in search, and indexers +- fixed parsing of page number in GET parameters +- fixed issues with generating pull-request overview for repos with + bookmarks and tags, also preview doesn't loose chosen revision from + select dropdown + +1.4.1 (**2012-09-07**) +---------------------- news ++++ diff --git a/docs/installation_win.rst b/docs/installation_win.rst --- a/docs/installation_win.rst +++ b/docs/installation_win.rst @@ -7,9 +7,15 @@ Step by step Installation for Windows RhodeCode step-by-step install Guide for Windows -Target OS: Windows XP SP3 English (Clean installation) +Target OS: Windows XP SP3 32bit English (Clean installation) + All Windows Updates until 24-may-2012 +.. note:: + + This installation is for 32bit systems, for 64bit windows you might need + to download proper 64bit version of "Windows Installer" and Win32py + extensions + Step1 - Install Visual Studio 2008 Express ------------------------------------------ diff --git a/production.ini b/production.ini --- a/production.ini +++ b/production.ini @@ -69,6 +69,8 @@ use_gravatar = true ## {email} user email ## {md5email} md5 hash of the user email (like at gravatar.com) ## {size} size of the image that is expected from the server application +## {scheme} http/https from RhodeCode server +## {netloc} network location from RhodeCode server #alternative_gravatar_url = http://myavatarserver.com/getbyemail/{email}/{size} #alternative_gravatar_url = http://myavatarserver.com/getbymd5/{md5email}?s={size} diff --git a/rhodecode/__init__.py b/rhodecode/__init__.py --- a/rhodecode/__init__.py +++ b/rhodecode/__init__.py @@ -26,7 +26,7 @@ import sys import platform -VERSION = (1, 4, 1) +VERSION = (1, 4, 2) try: from rhodecode.lib import get_current_revision diff --git a/rhodecode/config/deployment.ini_tmpl b/rhodecode/config/deployment.ini_tmpl --- a/rhodecode/config/deployment.ini_tmpl +++ b/rhodecode/config/deployment.ini_tmpl @@ -69,6 +69,8 @@ use_gravatar = true ## {email} user email ## {md5email} md5 hash of the user email (like at gravatar.com) ## {size} size of the image that is expected from the server application +## {scheme} http/https from RhodeCode server +## {netloc} network location from RhodeCode server #alternative_gravatar_url = http://myavatarserver.com/getbyemail/{email}/{size} #alternative_gravatar_url = http://myavatarserver.com/getbymd5/{md5email}?s={size} diff --git a/rhodecode/config/routing.py b/rhodecode/config/routing.py --- a/rhodecode/config/routing.py +++ b/rhodecode/config/routing.py @@ -141,6 +141,7 @@ def make_map(config): m.connect('repo_locking', "/repo_locking/{repo_name:.*?}", action="repo_locking", conditions=dict(method=["PUT"], function=check_repo)) + with rmap.submapper(path_prefix=ADMIN_PREFIX, controller='admin/repos_groups') as m: m.connect("repos_groups", "/repos_groups", @@ -561,6 +562,10 @@ def make_map(config): controller='settings', action='index', conditions=dict(function=check_repo)) + rmap.connect('toggle_locking', "/{repo_name:.*?}/locking_toggle", + controller='settings', action="toggle_locking", + conditions=dict(method=["GET"], function=check_repo)) + rmap.connect('repo_fork_create_home', '/{repo_name:.*?}/fork', controller='forks', action='fork_create', conditions=dict(function=check_repo, method=["POST"])) diff --git a/rhodecode/controllers/admin/admin.py b/rhodecode/controllers/admin/admin.py --- a/rhodecode/controllers/admin/admin.py +++ b/rhodecode/controllers/admin/admin.py @@ -32,6 +32,7 @@ from webhelpers.paginate import Page from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator from rhodecode.lib.base import BaseController, render from rhodecode.model.db import UserLog +from rhodecode.lib.utils2 import safe_int log = logging.getLogger(__name__) @@ -50,7 +51,7 @@ class AdminController(BaseController): .options(joinedload(UserLog.repository))\ .order_by(UserLog.action_date.desc()) - p = int(request.params.get('page', 1)) + p = safe_int(request.params.get('page', 1), 1) c.users_log = Page(users_log, page=p, items_per_page=10) c.log_data = render('admin/admin_log.html') diff --git a/rhodecode/controllers/admin/notifications.py b/rhodecode/controllers/admin/notifications.py --- a/rhodecode/controllers/admin/notifications.py +++ b/rhodecode/controllers/admin/notifications.py @@ -39,6 +39,7 @@ from rhodecode.model.notification import from rhodecode.lib.auth import LoginRequired, NotAnonymous from rhodecode.lib import helpers as h from rhodecode.model.meta import Session +from rhodecode.lib.utils2 import safe_int log = logging.getLogger(__name__) @@ -62,7 +63,8 @@ class NotificationsController(BaseContro c.user = self.rhodecode_user notif = NotificationModel().get_for_user(self.rhodecode_user.user_id, filter_=request.GET.getall('type')) - p = int(request.params.get('page', 1)) + + p = safe_int(request.params.get('page', 1), 1) c.notifications = Page(notif, page=p, items_per_page=10) c.pull_request_type = Notification.TYPE_PULL_REQUEST c.comment_type = [Notification.TYPE_CHANGESET_COMMENT, diff --git a/rhodecode/controllers/admin/repos.py b/rhodecode/controllers/admin/repos.py --- a/rhodecode/controllers/admin/repos.py +++ b/rhodecode/controllers/admin/repos.py @@ -66,7 +66,7 @@ class ReposController(BaseController): super(ReposController, self).__before__() def __load_defaults(self): - c.repo_groups = RepoGroup.groups_choices() + c.repo_groups = RepoGroup.groups_choices(check_perms=True) c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups) repo_model = RepoModel() diff --git a/rhodecode/controllers/admin/repos_groups.py b/rhodecode/controllers/admin/repos_groups.py --- a/rhodecode/controllers/admin/repos_groups.py +++ b/rhodecode/controllers/admin/repos_groups.py @@ -292,9 +292,9 @@ class ReposGroupsController(BaseControll c.repo_cnt = 0 - c.groups = RepoGroup.query().order_by(RepoGroup.group_name)\ + groups = RepoGroup.query().order_by(RepoGroup.group_name)\ .filter(RepoGroup.group_parent_id == id).all() - + c.groups = self.scm_model.get_repos_groups(groups) return render('admin/repos_groups/repos_groups.html') @HasPermissionAnyDecorator('hg.admin') diff --git a/rhodecode/controllers/admin/settings.py b/rhodecode/controllers/admin/settings.py --- a/rhodecode/controllers/admin/settings.py +++ b/rhodecode/controllers/admin/settings.py @@ -256,14 +256,31 @@ class SettingsController(BaseController) ## EXTENSIONS sett = RhodeCodeUi.get_by_key('largefiles') + if not sett: + #make one if it's not there ! + sett = RhodeCodeUi() + sett.ui_key = 'largefiles' + sett.ui_section = 'extensions' sett.ui_active = form_result[_f('extensions_largefiles')] Session().add(sett) sett = RhodeCodeUi.get_by_key('hgsubversion') + if not sett: + #make one if it's not there ! + sett = RhodeCodeUi() + sett.ui_key = 'hgsubversion' + sett.ui_section = 'extensions' + sett.ui_active = form_result[_f('extensions_hgsubversion')] Session().add(sett) # sett = RhodeCodeUi.get_by_key('hggit') +# if not sett: +# #make one if it's not there ! +# sett = RhodeCodeUi() +# sett.ui_key = 'hggit' +# sett.ui_section = 'extensions' +# # sett.ui_active = form_result[_f('extensions_hggit')] # Session().add(sett) @@ -451,7 +468,7 @@ class SettingsController(BaseController) def create_repository(self): """GET /_admin/create_repository: Form to create a new item""" - c.repo_groups = RepoGroup.groups_choices() + c.repo_groups = RepoGroup.groups_choices(check_perms=True) c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups) choices, c.landing_revs = ScmModel().get_repo_landing_revs() diff --git a/rhodecode/controllers/changelog.py b/rhodecode/controllers/changelog.py --- a/rhodecode/controllers/changelog.py +++ b/rhodecode/controllers/changelog.py @@ -37,6 +37,7 @@ from rhodecode.lib.helpers import RepoPa from rhodecode.lib.compat import json from rhodecode.lib.graphmod import _colored, _dagwalker from rhodecode.lib.vcs.exceptions import RepositoryError, ChangesetDoesNotExistError +from rhodecode.lib.utils2 import safe_int log = logging.getLogger(__name__) @@ -65,7 +66,7 @@ class ChangelogController(BaseRepoContro c.size = int(session.get('changelog_size', default)) # min size must be 1 c.size = max(c.size, 1) - p = int(request.params.get('page', 1)) + p = safe_int(request.params.get('page', 1), 1) branch_name = request.params.get('branch', None) try: if branch_name: diff --git a/rhodecode/controllers/compare.py b/rhodecode/controllers/compare.py --- a/rhodecode/controllers/compare.py +++ b/rhodecode/controllers/compare.py @@ -39,6 +39,7 @@ from rhodecode.lib import diffs from rhodecode.model.db import Repository from rhodecode.model.pull_request import PullRequestModel +from webob.exc import HTTPBadRequest log = logging.getLogger(__name__) @@ -51,10 +52,12 @@ class CompareController(BaseRepoControll def __before__(self): super(CompareController, self).__before__() - def __get_cs_or_redirect(self, rev, repo, redirect_after=True): + def __get_cs_or_redirect(self, rev, repo, redirect_after=True, + partial=False): """ Safe way to get changeset if error occur it redirects to changeset with - proper message + proper message. If partial is set then don't do redirect raise Exception + instead :param rev: revision to fetch :param repo: repo instance @@ -73,7 +76,9 @@ class CompareController(BaseRepoControll except RepositoryError, e: log.error(traceback.format_exc()) h.flash(str(e), category='warning') - redirect(h.url('summary_home', repo_name=repo.repo_name)) + if not partial: + redirect(h.url('summary_home', repo_name=repo.repo_name)) + raise HTTPBadRequest() def index(self, org_ref_type, org_ref, other_ref_type, other_ref): @@ -97,9 +102,9 @@ class CompareController(BaseRepoControll if c.org_repo.scm_instance.alias != 'hg': log.error('Review not available for GIT REPOS') raise HTTPNotFound - - self.__get_cs_or_redirect(rev=org_ref, repo=org_repo) - self.__get_cs_or_redirect(rev=other_ref, repo=other_repo) + partial = request.environ.get('HTTP_X_PARTIAL_XHR') + self.__get_cs_or_redirect(rev=org_ref, repo=org_repo, partial=partial) + self.__get_cs_or_redirect(rev=other_ref, repo=other_repo, partial=partial) c.cs_ranges, discovery_data = PullRequestModel().get_compare_data( org_repo, org_ref, other_repo, other_ref @@ -110,7 +115,7 @@ class CompareController(BaseRepoControll c.target_repo = c.repo_name # defines that we need hidden inputs with changesets c.as_form = request.GET.get('as_form', False) - if request.environ.get('HTTP_X_PARTIAL_XHR'): + if partial: return render('compare/compare_cs.html') c.org_ref = org_ref[1] diff --git a/rhodecode/controllers/followers.py b/rhodecode/controllers/followers.py --- a/rhodecode/controllers/followers.py +++ b/rhodecode/controllers/followers.py @@ -30,6 +30,7 @@ from rhodecode.lib.helpers import Page from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator from rhodecode.lib.base import BaseRepoController, render from rhodecode.model.db import Repository, User, UserFollowing +from rhodecode.lib.utils2 import safe_int log = logging.getLogger(__name__) @@ -43,7 +44,7 @@ class FollowersController(BaseRepoContro super(FollowersController, self).__before__() def followers(self, repo_name): - p = int(request.params.get('page', 1)) + p = safe_int(request.params.get('page', 1), 1) repo_id = c.rhodecode_db_repo.repo_id d = UserFollowing.get_repo_followers(repo_id)\ .order_by(UserFollowing.follows_from) diff --git a/rhodecode/controllers/forks.py b/rhodecode/controllers/forks.py --- a/rhodecode/controllers/forks.py +++ b/rhodecode/controllers/forks.py @@ -42,6 +42,7 @@ from rhodecode.model.db import Repositor from rhodecode.model.repo import RepoModel from rhodecode.model.forms import RepoForkForm from rhodecode.model.scm import ScmModel +from rhodecode.lib.utils2 import safe_int log = logging.getLogger(__name__) @@ -53,7 +54,7 @@ class ForksController(BaseRepoController super(ForksController, self).__before__() def __load_defaults(self): - c.repo_groups = RepoGroup.groups_choices() + c.repo_groups = RepoGroup.groups_choices(check_perms=True) c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups) choices, c.landing_revs = ScmModel().get_repo_landing_revs() c.landing_revs_choices = choices @@ -105,7 +106,7 @@ class ForksController(BaseRepoController @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', 'repository.admin') def forks(self, repo_name): - p = int(request.params.get('page', 1)) + p = safe_int(request.params.get('page', 1), 1) repo_id = c.rhodecode_db_repo.repo_id d = [] for r in Repository.get_repo_forks(repo_id): diff --git a/rhodecode/controllers/journal.py b/rhodecode/controllers/journal.py --- a/rhodecode/controllers/journal.py +++ b/rhodecode/controllers/journal.py @@ -41,6 +41,7 @@ from rhodecode.model.db import UserLog, from rhodecode.model.meta import Session from sqlalchemy.sql.expression import func from rhodecode.model.scm import ScmModel +from rhodecode.lib.utils2 import safe_int log = logging.getLogger(__name__) @@ -57,7 +58,7 @@ class JournalController(BaseController): @NotAnonymous() def index(self): # Return a rendered template - p = int(request.params.get('page', 1)) + p = safe_int(request.params.get('page', 1), 1) c.user = User.get(self.rhodecode_user.user_id) all_repos = self.sa.query(Repository)\ @@ -177,7 +178,7 @@ class JournalController(BaseController): @LoginRequired() def public_journal(self): # Return a rendered template - p = int(request.params.get('page', 1)) + p = safe_int(request.params.get('page', 1), 1) c.following = self.sa.query(UserFollowing)\ .filter(UserFollowing.user_id == self.rhodecode_user.user_id)\ diff --git a/rhodecode/controllers/pullrequests.py b/rhodecode/controllers/pullrequests.py --- a/rhodecode/controllers/pullrequests.py +++ b/rhodecode/controllers/pullrequests.py @@ -81,6 +81,19 @@ class PullrequestsController(BaseRepoCon return hist_l + def _get_default_rev(self, repo): + """ + Get's default revision to do compare on pull request + + :param repo: + """ + repo = repo.scm_instance + if 'default' in repo.branches: + return 'default' + else: + #if repo doesn't have default branch return first found + return repo.branches.keys()[0] + def show_all(self, repo_name): c.pull_requests = PullRequestModel().get_all(repo_name) c.repo_name = repo_name @@ -106,7 +119,8 @@ class PullrequestsController(BaseRepoCon # add org repo to other so we can open pull request agains itself c.other_repos.extend(c.org_repos) - c.default_pull_request = org_repo.repo_name + c.default_pull_request = org_repo.repo_name # repo name pre-selected + c.default_pull_request_rev = self._get_default_rev(org_repo) # revision pre-selected c.default_revs = self._get_repo_refs(org_repo.scm_instance) #add orginal repo other_repos_info[org_repo.repo_name] = { @@ -130,6 +144,8 @@ class PullrequestsController(BaseRepoCon #add parents of this fork also if org_repo.parent: c.default_pull_request = org_repo.parent.repo_name + c.default_pull_request_rev = self._get_default_rev(org_repo.parent) + c.default_revs = self._get_repo_refs(org_repo.parent.scm_instance) c.other_repos.append((org_repo.parent.repo_name, '%s/%s' % ( org_repo.parent.user.username, org_repo.parent.repo_name)) diff --git a/rhodecode/controllers/search.py b/rhodecode/controllers/search.py --- a/rhodecode/controllers/search.py +++ b/rhodecode/controllers/search.py @@ -40,6 +40,7 @@ from whoosh.index import open_dir, Empty from whoosh.qparser import QueryParser, QueryParserError from whoosh.query import Phrase, Wildcard, Term, Prefix from rhodecode.model.repo import RepoModel +from rhodecode.lib.utils2 import safe_str, safe_int log = logging.getLogger(__name__) @@ -82,7 +83,7 @@ class SearchController(BaseController): log.debug(cur_query) if c.cur_query: - p = int(request.params.get('page', 1)) + p = safe_int(request.params.get('page', 1), 1) highlight_items = set() try: idx = open_dir(config['app_conf']['index_dir'], @@ -116,7 +117,7 @@ class SearchController(BaseController): def url_generator(**kw): return update_params("?q=%s&type=%s" \ - % (c.cur_query, c.cur_type), **kw) + % (safe_str(c.cur_query), safe_str(c.cur_type)), **kw) repo_location = RepoModel().repos_path c.formated_results = Page( WhooshResultWrapper(search_type, searcher, matcher, diff --git a/rhodecode/controllers/settings.py b/rhodecode/controllers/settings.py --- a/rhodecode/controllers/settings.py +++ b/rhodecode/controllers/settings.py @@ -35,13 +35,14 @@ from pylons.i18n.translation import _ import rhodecode.lib.helpers as h -from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAllDecorator +from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAllDecorator,\ + HasRepoPermissionAnyDecorator from rhodecode.lib.base import BaseRepoController, render from rhodecode.lib.utils import invalidate_cache, action_logger from rhodecode.model.forms import RepoSettingsForm from rhodecode.model.repo import RepoModel -from rhodecode.model.db import RepoGroup +from rhodecode.model.db import RepoGroup, Repository from rhodecode.model.meta import Session from rhodecode.model.scm import ScmModel @@ -55,7 +56,7 @@ class SettingsController(BaseRepoControl super(SettingsController, self).__before__() def __load_defaults(self): - c.repo_groups = RepoGroup.groups_choices() + c.repo_groups = RepoGroup.groups_choices(check_perms=True) c.repo_groups_choices = map(lambda k: unicode(k[0]), c.repo_groups) repo_model = RepoModel() @@ -109,7 +110,7 @@ class SettingsController(BaseRepoControl changed_name = form_result['repo_name_full'] action_logger(self.rhodecode_user, 'user_updated_repo', changed_name, self.ip_addr, self.sa) - Session.commit() + Session().commit() except formencode.Invalid, errors: c.repo_info = repo_model.get_by_repo_name(repo_name) c.users_array = repo_model.get_users_js() @@ -153,10 +154,38 @@ class SettingsController(BaseRepoControl repo_model.delete(repo) invalidate_cache('get_repo_cached_%s' % repo_name) h.flash(_('deleted repository %s') % repo_name, category='success') - Session.commit() + Session().commit() except Exception: log.error(traceback.format_exc()) h.flash(_('An error occurred during deletion of %s') % repo_name, category='error') return redirect(url('home')) + + @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin') + def toggle_locking(self, repo_name): + """ + Toggle locking of repository by simple GET call to url + + :param repo_name: + """ + + try: + repo = Repository.get_by_repo_name(repo_name) + + if repo.enable_locking: + if repo.locked[0]: + Repository.unlock(repo) + action = _('unlocked') + else: + Repository.lock(repo, c.rhodecode_user.user_id) + action = _('locked') + + h.flash(_('Repository has been %s') % action, + category='success') + except Exception, e: + log.error(traceback.format_exc()) + h.flash(_('An error occurred during unlocking'), + category='error') + return redirect(url('summary_home', repo_name=repo_name)) + diff --git a/rhodecode/controllers/shortlog.py b/rhodecode/controllers/shortlog.py --- a/rhodecode/controllers/shortlog.py +++ b/rhodecode/controllers/shortlog.py @@ -31,6 +31,7 @@ from rhodecode.lib.auth import LoginRequ from rhodecode.lib.base import BaseRepoController, render from rhodecode.lib.helpers import RepoPage from pylons.controllers.util import redirect +from rhodecode.lib.utils2 import safe_int log = logging.getLogger(__name__) @@ -44,8 +45,8 @@ class ShortlogController(BaseRepoControl super(ShortlogController, self).__before__() def index(self, repo_name): - p = int(request.params.get('page', 1)) - size = int(request.params.get('size', 20)) + p = safe_int(request.params.get('page', 1), 1) + size = safe_int(request.params.get('size', 20), 20) def url_generator(**kw): return url('shortlog_home', repo_name=repo_name, size=size, **kw) diff --git a/rhodecode/i18n/zh_CN/LC_MESSAGES/rhodecode.mo b/rhodecode/i18n/zh_CN/LC_MESSAGES/rhodecode.mo index 341b41274f27d4b8495c51072b2c3252f2705a68..cd423e40593c578ae8b07dcf04bfeaae941d3810 GIT binary patch literal 53600 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 CNgPA~ diff --git a/rhodecode/i18n/zh_CN/LC_MESSAGES/rhodecode.po b/rhodecode/i18n/zh_CN/LC_MESSAGES/rhodecode.po --- a/rhodecode/i18n/zh_CN/LC_MESSAGES/rhodecode.po +++ b/rhodecode/i18n/zh_CN/LC_MESSAGES/rhodecode.po @@ -3,37 +3,40 @@ # This file is distributed under the same license as the RhodeCode project. # FIRST AUTHOR , 2011. # mikespook , 2012. +# xpol , 2012. msgid "" msgstr "" "Project-Id-Version: RhodeCode 1.2.0\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "POT-Creation-Date: 2012-09-02 20:30+0200\n" -"PO-Revision-Date: 2012-04-05 17:37+0800\n" -"Last-Translator: mikespook \n" +"PO-Revision-Date: 2012-09-19 13:27+0800\n" +"Last-Translator: xpol \n" "Language-Team: mikespook\n" -"Plural-Forms: nplurals=1; plural=0\n" +"Plural-Forms: nplurals=1; plural=0;\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 0.9.6\n" +"X-Generator: Poedit 1.5.3\n" +"X-Poedit-Basepath: E:\\home\\rhodecode\n" +"X-Poedit-SourceCharset: UTF-8\n" #: rhodecode/controllers/changelog.py:94 -#, fuzzy msgid "All Branches" -msgstr "分支" +msgstr "所有分支" #: rhodecode/controllers/changeset.py:83 msgid "show white space" -msgstr "" +msgstr "显示空白字符" #: rhodecode/controllers/changeset.py:90 rhodecode/controllers/changeset.py:97 msgid "ignore white space" -msgstr "" +msgstr "忽略空白字符" #: rhodecode/controllers/changeset.py:157 -#, fuzzy, python-format +#, python-format msgid "%s line context" -msgstr "文件内容" +msgstr "%s 行上下文" #: rhodecode/controllers/changeset.py:333 #: rhodecode/controllers/changeset.py:348 rhodecode/lib/diffs.py:70 @@ -42,21 +45,21 @@ msgstr "二进制文件" #: rhodecode/controllers/changeset.py:408 msgid "" -"Changing status on a changeset associated witha closed pull request is " -"not allowed" -msgstr "" +"Changing status on a changeset associated witha closed pull request is not " +"allowed" +msgstr "不允许修改已关闭拉取请求的修订集状态" #: rhodecode/controllers/compare.py:69 -#, fuzzy msgid "There are no changesets yet" -msgstr "没有任何变更" +msgstr "还没有修订集" #: rhodecode/controllers/error.py:69 msgid "Home page" msgstr "主页" #: rhodecode/controllers/error.py:98 -msgid "The request could not be understood by the server due to malformed syntax." +msgid "" +"The request could not be understood by the server due to malformed syntax." msgstr "由于错误的语法,服务器无法对请求进行响应。" #: rhodecode/controllers/error.py:101 @@ -88,24 +91,22 @@ msgid "%s %s feed" msgstr "%s %s 订阅" #: rhodecode/controllers/feed.py:75 -#, fuzzy msgid "commited on" -msgstr "提交" +msgstr "提交于" #: rhodecode/controllers/files.py:84 -#, fuzzy msgid "click here to add new file" -msgstr "添加新用户" +msgstr "点击此处添加新文件" #: rhodecode/controllers/files.py:85 -#, fuzzy, python-format +#, python-format msgid "There are no files yet %s" -msgstr "尚无文件" +msgstr "还没有文件 %s" #: rhodecode/controllers/files.py:239 rhodecode/controllers/files.py:299 #, python-format msgid "This repository is has been locked by %s on %s" -msgstr "" +msgstr "版本库由 %s 于 %s 锁定" #: rhodecode/controllers/files.py:266 #, python-format @@ -126,19 +127,17 @@ msgid "Error occurred during commit" msgstr "提交时发生错误" #: rhodecode/controllers/files.py:318 -#, fuzzy, python-format +#, python-format msgid "Added %s via RhodeCode" -msgstr "通过 RhodeCode 修改了 %s" +msgstr "通过 RhodeCode 添加了 %s" #: rhodecode/controllers/files.py:332 -#, fuzzy msgid "No content" -msgstr "文件内容" +msgstr "无内容" #: rhodecode/controllers/files.py:336 -#, fuzzy msgid "No filename" -msgstr "文件名" +msgstr "无文件名" #: rhodecode/controllers/files.py:378 msgid "downloads disabled" @@ -161,7 +160,7 @@ msgstr "未知包类型" #: rhodecode/templates/changeset/changeset_range.html:13 #: rhodecode/templates/changeset/changeset_range.html:31 msgid "Changesets" -msgstr "变更集" +msgstr "修订集" #: rhodecode/controllers/files.py:495 rhodecode/controllers/pullrequests.py:72 #: rhodecode/controllers/summary.py:232 rhodecode/model/scm.py:543 @@ -176,18 +175,20 @@ msgstr "标签" #: rhodecode/controllers/forks.py:73 rhodecode/controllers/admin/repos.py:90 #, python-format msgid "" -"%s repository is not mapped to db perhaps it was created or renamed from " -"the filesystem please run the application again in order to rescan " -"repositories" +"%s repository is not mapped to db perhaps it was created or renamed from the " +"filesystem please run the application again in order to rescan repositories" msgstr "" +"版本库 %s 没有映射到数据库,可能是从文件系统创建或者重命名,请重启 RhodeCode " +"以重新扫描版本库" #: rhodecode/controllers/forks.py:133 rhodecode/controllers/settings.py:72 #, python-format msgid "" -"%s repository is not mapped to db perhaps it was created or renamed from " -"the file system please run the application again in order to rescan " -"repositories" +"%s repository is not mapped to db perhaps it was created or renamed from the " +"file system please run the application again in order to rescan repositories" msgstr "" +" 版本库 %s 没有映射到数据库,可能是从文件系统创建或者重命名,请重启 " +"RhodeCode 以重新扫描版本库" #: rhodecode/controllers/forks.py:167 #, python-format @@ -197,10 +198,9 @@ msgstr "版本库 %s 被分支到 %s" #: rhodecode/controllers/forks.py:181 #, python-format msgid "An error occurred during repository forking %s" -msgstr "" +msgstr "在分支版本库 %s 的时候发生错误" #: rhodecode/controllers/journal.py:202 rhodecode/controllers/journal.py:239 -#, fuzzy msgid "public journal" msgstr "公共日志" @@ -219,37 +219,32 @@ msgstr "密码重置链接已经发送" #: rhodecode/controllers/login.py:184 msgid "" -"Your password reset was successful, new password has been sent to your " -"email" +"Your password reset was successful, new password has been sent to your email" msgstr "密码已经成功重置,新密码已经发送到你的邮箱" #: rhodecode/controllers/pullrequests.py:74 rhodecode/model/scm.py:549 msgid "Bookmarks" -msgstr "" +msgstr "书签" #: rhodecode/controllers/pullrequests.py:158 msgid "Pull request requires a title with min. 3 chars" -msgstr "" +msgstr "拉取请求的标题至少 3 个字符" #: rhodecode/controllers/pullrequests.py:160 -#, fuzzy msgid "error during creation of pull request" -msgstr "提交时发生错误" +msgstr "提交拉取请求时发生错误" #: rhodecode/controllers/pullrequests.py:181 -#, fuzzy msgid "Successfully opened new pull request" -msgstr "用户删除成功" +msgstr "成功提交拉取请求" #: rhodecode/controllers/pullrequests.py:184 -#, fuzzy msgid "Error occurred during sending pull request" -msgstr "提交时发生错误" +msgstr "提交拉取请求时发生错误" #: rhodecode/controllers/pullrequests.py:217 -#, fuzzy msgid "Successfully deleted pull request" -msgstr "用户删除成功" +msgstr "成功删除拉取请求" #: rhodecode/controllers/search.py:131 msgid "Invalid search query. Try quoting it." @@ -273,16 +268,17 @@ msgstr "版本库 %s 成功更新" #: rhodecode/controllers/admin/repos.py:284 #, python-format msgid "error occurred during update of repository %s" -msgstr "" +msgstr "在更新版本库 %s 的时候发生错误" #: rhodecode/controllers/settings.py:143 #: rhodecode/controllers/admin/repos.py:302 #, python-format msgid "" -"%s repository is not mapped to db perhaps it was moved or renamed from " -"the filesystem please run the application again in order to rescan " -"repositories" +"%s repository is not mapped to db perhaps it was moved or renamed from the " +"filesystem please run the application again in order to rescan repositories" msgstr "" +"版本库 %s 没有映射到数据库,可能是从文件系统创建或者重命名,请重启 RhodeCode " +"以重新扫描版本库" #: rhodecode/controllers/settings.py:155 #: rhodecode/controllers/admin/repos.py:314 @@ -295,11 +291,11 @@ msgstr "已经删除版本库 %s" #: rhodecode/controllers/admin/repos.py:330 #, python-format msgid "An error occurred during deletion of %s" -msgstr "" +msgstr "在删除 %s 的时候发生错误" #: rhodecode/controllers/summary.py:138 msgid "No data loaded yet" -msgstr "" +msgstr "数据未加载" #: rhodecode/controllers/summary.py:142 #: rhodecode/templates/summary/summary.html:148 @@ -308,35 +304,35 @@ msgstr "该版本库统计功能已经禁用" #: rhodecode/controllers/admin/ldap_settings.py:50 msgid "BASE" -msgstr "" +msgstr "BASE" #: rhodecode/controllers/admin/ldap_settings.py:51 msgid "ONELEVEL" -msgstr "" +msgstr "ONELEVEL" #: rhodecode/controllers/admin/ldap_settings.py:52 msgid "SUBTREE" -msgstr "" +msgstr "SUBTREE" #: rhodecode/controllers/admin/ldap_settings.py:56 msgid "NEVER" -msgstr "" +msgstr "NEVER" #: rhodecode/controllers/admin/ldap_settings.py:57 msgid "ALLOW" -msgstr "" +msgstr "ALLOW" #: rhodecode/controllers/admin/ldap_settings.py:58 msgid "TRY" -msgstr "" +msgstr "TRY" #: rhodecode/controllers/admin/ldap_settings.py:59 msgid "DEMAND" -msgstr "" +msgstr "DEMAND" #: rhodecode/controllers/admin/ldap_settings.py:60 msgid "HARD" -msgstr "" +msgstr "HARD" #: rhodecode/controllers/admin/ldap_settings.py:64 msgid "No encryption" @@ -344,11 +340,11 @@ msgstr "未加密" #: rhodecode/controllers/admin/ldap_settings.py:65 msgid "LDAPS connection" -msgstr "" +msgstr "LDAPS 连接" #: rhodecode/controllers/admin/ldap_settings.py:66 msgid "START_TLS on LDAP connection" -msgstr "" +msgstr "LDAP 连接上的 START_TLS" #: rhodecode/controllers/admin/ldap_settings.py:126 msgid "Ldap settings updated successfully" @@ -356,11 +352,11 @@ msgstr "LDAP 设置已经成功更新" #: rhodecode/controllers/admin/ldap_settings.py:130 msgid "Unable to activate ldap. The \"python-ldap\" library is missing." -msgstr "无法启用 LDAP。库“python-ldap”缺失。" +msgstr "无法启用 LDAP。缺失“python-ldap”库。" #: rhodecode/controllers/admin/ldap_settings.py:147 msgid "error occurred during update of ldap settings" -msgstr "" +msgstr "更新 LDAP 设置时发生错误" #: rhodecode/controllers/admin/permissions.py:59 msgid "None" @@ -427,11 +423,11 @@ msgstr "成功更新默认权限" #: rhodecode/controllers/admin/permissions.py:130 msgid "error occurred during update of permissions" -msgstr "" +msgstr "更新权限时发生错误" #: rhodecode/controllers/admin/repos.py:123 msgid "--REMOVE FORK--" -msgstr "" +msgstr "-- 移除分支 --" #: rhodecode/controllers/admin/repos.py:192 #, python-format @@ -446,67 +442,65 @@ msgstr "建立版本库 %s" #: rhodecode/controllers/admin/repos.py:227 #, python-format msgid "error occurred during creation of repository %s" -msgstr "" +msgstr "创建版本库时发生错误 %s" #: rhodecode/controllers/admin/repos.py:319 #, python-format msgid "Cannot delete %s it still contains attached forks" -msgstr "" +msgstr "无法删除 %s 因为它还有其他分支版本库" #: rhodecode/controllers/admin/repos.py:348 msgid "An error occurred during deletion of repository user" -msgstr "" +msgstr "删除版本库用户时发生错误" #: rhodecode/controllers/admin/repos.py:367 msgid "An error occurred during deletion of repository users groups" -msgstr "" +msgstr "删除版本库用户组时发生错误" #: rhodecode/controllers/admin/repos.py:385 msgid "An error occurred during deletion of repository stats" -msgstr "" +msgstr "删除版本库统计时发生错误" #: rhodecode/controllers/admin/repos.py:402 msgid "An error occurred during cache invalidation" -msgstr "" +msgstr "清除缓存时发生错误" #: rhodecode/controllers/admin/repos.py:422 -#, fuzzy msgid "An error occurred during unlocking" -msgstr "在搜索操作中发生异常" +msgstr "解锁时发生错误" #: rhodecode/controllers/admin/repos.py:442 msgid "Updated repository visibility in public journal" -msgstr "" +msgstr "成功更新在公共日志中的可见性" #: rhodecode/controllers/admin/repos.py:446 msgid "An error occurred during setting this repository in public journal" -msgstr "" +msgstr "设置版本库到公共日志时发生错误" #: rhodecode/controllers/admin/repos.py:451 rhodecode/model/validators.py:299 msgid "Token mismatch" -msgstr "" +msgstr "令牌不匹配" #: rhodecode/controllers/admin/repos.py:464 msgid "Pulled from remote location" -msgstr "" +msgstr "成功拉取自远程路径" #: rhodecode/controllers/admin/repos.py:466 msgid "An error occurred during pull from remote location" -msgstr "" +msgstr "从远程路径拉取时发生错误" #: rhodecode/controllers/admin/repos.py:482 msgid "Nothing" -msgstr "" +msgstr "无" #: rhodecode/controllers/admin/repos.py:484 -#, fuzzy, python-format +#, python-format msgid "Marked repo %s as fork of %s" -msgstr "新版本库 %s 基于 %s 建立。" +msgstr "成功将版本库 %s 标记为从 %s 分支" #: rhodecode/controllers/admin/repos.py:488 -#, fuzzy msgid "An error occurred during this operation" -msgstr "在搜索操作中发生异常" +msgstr "在搜索操作中发生错误" #: rhodecode/controllers/admin/repos_groups.py:116 #, python-format @@ -516,7 +510,7 @@ msgstr "建立版本库组 %s" #: rhodecode/controllers/admin/repos_groups.py:129 #, python-format msgid "error occurred during creation of repos group %s" -msgstr "" +msgstr "创建版本库组时发生错误 %s" #: rhodecode/controllers/admin/repos_groups.py:163 #, python-format @@ -526,12 +520,12 @@ msgstr "更新版本库组 %s" #: rhodecode/controllers/admin/repos_groups.py:176 #, python-format msgid "error occurred during update of repos group %s" -msgstr "" +msgstr "更新版本库组时发生错误 %s" #: rhodecode/controllers/admin/repos_groups.py:194 #, python-format msgid "This group contains %s repositores and cannot be deleted" -msgstr "" +msgstr "这个组内有 %s 个版本库因而无法删除" #: rhodecode/controllers/admin/repos_groups.py:202 #, python-format @@ -540,27 +534,26 @@ msgstr "移除版本库组 %s" #: rhodecode/controllers/admin/repos_groups.py:208 msgid "Cannot delete this group it still contains subgroups" -msgstr "" +msgstr "不能删除包含子组的组" #: rhodecode/controllers/admin/repos_groups.py:213 #: rhodecode/controllers/admin/repos_groups.py:218 #, python-format msgid "error occurred during deletion of repos group %s" -msgstr "" +msgstr "删除版本库组时发生错误 %s" #: rhodecode/controllers/admin/repos_groups.py:238 -#, fuzzy msgid "An error occurred during deletion of group user" -msgstr "在搜索操作中发生异常" +msgstr "删除组用户时发生错误" #: rhodecode/controllers/admin/repos_groups.py:258 msgid "An error occurred during deletion of group users groups" -msgstr "" +msgstr "删除版本库组的用户组时发生错误" #: rhodecode/controllers/admin/settings.py:121 #, python-format msgid "Repositories successfully rescanned added: %s,removed: %s" -msgstr "" +msgstr "重新扫描版本库成功,增加 %s, 移除 %s" #: rhodecode/controllers/admin/settings.py:129 msgid "Whoosh reindex task scheduled" @@ -573,26 +566,23 @@ msgstr "更新应用设置" #: rhodecode/controllers/admin/settings.py:164 #: rhodecode/controllers/admin/settings.py:275 msgid "error occurred during updating application settings" -msgstr "" +msgstr "更新设置时发生错误" #: rhodecode/controllers/admin/settings.py:200 -#, fuzzy msgid "Updated visualisation settings" -msgstr "更新应用设置" +msgstr "成功更新可视化设置" #: rhodecode/controllers/admin/settings.py:205 -#, fuzzy msgid "error occurred during updating visualisation settings" -msgstr "提交时发生错误" +msgstr "更新可视化设置时发生错误" #: rhodecode/controllers/admin/settings.py:271 -#, fuzzy msgid "Updated VCS settings" -msgstr "更新 mercurial 设置" +msgstr "成功更新版本控制系统设置" #: rhodecode/controllers/admin/settings.py:285 msgid "Added new hook" -msgstr "新增钩子" +msgstr "新建钩子" #: rhodecode/controllers/admin/settings.py:297 msgid "Updated hooks" @@ -600,15 +590,15 @@ msgstr "更新钩子" #: rhodecode/controllers/admin/settings.py:301 msgid "error occurred during hook creation" -msgstr "" +msgstr "创建钩子时发生错误" #: rhodecode/controllers/admin/settings.py:320 msgid "Email task created" -msgstr "" +msgstr "已创建电子邮件任务" #: rhodecode/controllers/admin/settings.py:375 msgid "You can't edit this user since it's crucial for entire application" -msgstr "" +msgstr "由于是系统帐号,无法编辑该用户" #: rhodecode/controllers/admin/settings.py:406 msgid "Your account was updated successfully" @@ -618,7 +608,7 @@ msgstr "你的帐号已经更新完成" #: rhodecode/controllers/admin/users.py:191 #, python-format msgid "error occurred during update of user %s" -msgstr "" +msgstr "更新用户 %s 时发生错误" #: rhodecode/controllers/admin/users.py:130 #, python-format @@ -628,7 +618,7 @@ msgstr "创建用户 %s" #: rhodecode/controllers/admin/users.py:142 #, python-format msgid "error occurred during creation of user %s" -msgstr "" +msgstr "创建用户 %s 时发生错误" #: rhodecode/controllers/admin/users.py:171 msgid "User updated successfully" @@ -640,7 +630,7 @@ msgstr "用户删除成功" #: rhodecode/controllers/admin/users.py:212 msgid "An error occurred during deletion of user" -msgstr "" +msgstr "删除用户时发生错误" #: rhodecode/controllers/admin/users.py:226 msgid "You can't edit this user" @@ -648,42 +638,37 @@ msgstr "无法编辑该用户" #: rhodecode/controllers/admin/users.py:266 msgid "Granted 'repository create' permission to user" -msgstr "" +msgstr "已授予用户‘创建版本库’的权限" #: rhodecode/controllers/admin/users.py:271 msgid "Revoked 'repository create' permission to user" -msgstr "" +msgstr "已撤销用户‘创建版本库’的权限" #: rhodecode/controllers/admin/users.py:277 -#, fuzzy msgid "Granted 'repository fork' permission to user" -msgstr "版本库权限" +msgstr "成功授予了用户“分支版本库”权限" #: rhodecode/controllers/admin/users.py:282 -#, fuzzy msgid "Revoked 'repository fork' permission to user" -msgstr "版本库权限" +msgstr "成功撤销用户“分支版本库”权限" #: rhodecode/controllers/admin/users.py:288 #: rhodecode/controllers/admin/users_groups.py:255 -#, fuzzy msgid "An error occurred during permissions saving" -msgstr "在搜索操作中发生异常" +msgstr "保存权限时发生错误" #: rhodecode/controllers/admin/users.py:303 #, python-format msgid "Added email %s to user" -msgstr "" +msgstr "已为用户添加电子邮件 %s" #: rhodecode/controllers/admin/users.py:309 -#, fuzzy msgid "An error occurred during email saving" -msgstr "在搜索操作中发生异常" +msgstr "保存电子邮件时发生错误" #: rhodecode/controllers/admin/users.py:319 -#, fuzzy msgid "Removed email from user" -msgstr "移除版本库组 %s" +msgstr "成功删除用户电子邮件" #: rhodecode/controllers/admin/users_groups.py:84 #, python-format @@ -693,7 +678,7 @@ msgstr "建立用户组 %s" #: rhodecode/controllers/admin/users_groups.py:95 #, python-format msgid "error occurred during creation of users group %s" -msgstr "" +msgstr "创建用户组 %s 时发生错误" #: rhodecode/controllers/admin/users_groups.py:135 #, python-format @@ -703,7 +688,7 @@ msgstr "更新用户组 %s" #: rhodecode/controllers/admin/users_groups.py:157 #, python-format msgid "error occurred during update of users group %s" -msgstr "" +msgstr "更新用户组 %s 时发生错误" #: rhodecode/controllers/admin/users_groups.py:174 msgid "successfully deleted users group" @@ -711,23 +696,23 @@ msgstr "删除用户组成功" #: rhodecode/controllers/admin/users_groups.py:179 msgid "An error occurred during deletion of users group" -msgstr "" +msgstr "删除用户组时发生错误" #: rhodecode/controllers/admin/users_groups.py:233 msgid "Granted 'repository create' permission to users group" -msgstr "" +msgstr "已授予用户组‘创建版本库’的权限" #: rhodecode/controllers/admin/users_groups.py:238 msgid "Revoked 'repository create' permission to users group" -msgstr "" +msgstr "已撤销用户组‘创建版本库’的权限" #: rhodecode/controllers/admin/users_groups.py:244 msgid "Granted 'repository fork' permission to users group" -msgstr "" +msgstr "已授予用户组‘分支版本库’的权限" #: rhodecode/controllers/admin/users_groups.py:249 msgid "Revoked 'repository fork' permission to users group" -msgstr "" +msgstr "已撤销用户组‘分支版本库’的权限" #: rhodecode/lib/auth.py:499 msgid "You need to be a registered user to perform this action" @@ -738,51 +723,51 @@ msgid "You need to be a signed in to vie msgstr "必须登录才能访问该页面" #: rhodecode/lib/diffs.py:86 -msgid "Changeset was too big and was cut off, use diff menu to display this diff" -msgstr "变更集因过大而被截断,可查看原始变更集作为替代" +msgid "" +"Changeset was too big and was cut off, use diff menu to display this diff" +msgstr "修订集因过大而被截断,可查看原始修订集作为替代" #: rhodecode/lib/diffs.py:96 -#, fuzzy msgid "No changes detected" -msgstr "尚无修订" +msgstr "未发现差异" #: rhodecode/lib/helpers.py:372 #, python-format msgid "%a, %d %b %Y %H:%M:%S" -msgstr "" +msgstr "%Y/%b/%d %H:%M:%S %a" #: rhodecode/lib/helpers.py:484 msgid "True" -msgstr "" +msgstr "是" #: rhodecode/lib/helpers.py:488 msgid "False" -msgstr "" +msgstr "否" #: rhodecode/lib/helpers.py:532 -#, fuzzy msgid "Changeset not found" -msgstr "修改" +msgstr "未找到修订集" #: rhodecode/lib/helpers.py:555 #, python-format msgid "Show all combined changesets %s->%s" -msgstr "" +msgstr "显示合并的修订集 %s->%s" #: rhodecode/lib/helpers.py:561 msgid "compare view" -msgstr "" +msgstr "比较显示" #: rhodecode/lib/helpers.py:581 msgid "and" -msgstr "" +msgstr "还有" #: rhodecode/lib/helpers.py:582 #, python-format msgid "%s more" -msgstr "" - -#: rhodecode/lib/helpers.py:583 rhodecode/templates/changelog/changelog.html:48 +msgstr "%s 个" + +#: rhodecode/lib/helpers.py:583 +#: rhodecode/templates/changelog/changelog.html:48 msgid "revisions" msgstr "修订" @@ -795,257 +780,235 @@ msgstr "分支名称" #: rhodecode/templates/pullrequests/pullrequest_show.html:12 #, python-format msgid "Pull request #%s" -msgstr "" +msgstr "拉取请求 #%s" #: rhodecode/lib/helpers.py:626 msgid "[deleted] repository" -msgstr "" +msgstr "[删除] 版本库" #: rhodecode/lib/helpers.py:628 rhodecode/lib/helpers.py:638 msgid "[created] repository" -msgstr "" +msgstr "[创建] 版本库" #: rhodecode/lib/helpers.py:630 -#, fuzzy msgid "[created] repository as fork" -msgstr "建立版本库 %s" +msgstr "[创建] 分支版本库" #: rhodecode/lib/helpers.py:632 rhodecode/lib/helpers.py:640 msgid "[forked] repository" -msgstr "" +msgstr "[分支] 版本库" #: rhodecode/lib/helpers.py:634 rhodecode/lib/helpers.py:642 msgid "[updated] repository" -msgstr "" +msgstr "[更新] 版本库" #: rhodecode/lib/helpers.py:636 msgid "[delete] repository" -msgstr "" +msgstr "[删除] 版本库" #: rhodecode/lib/helpers.py:644 -#, fuzzy msgid "[created] user" -msgstr "创建用户 %s" +msgstr "[创建] 用户" #: rhodecode/lib/helpers.py:646 -#, fuzzy msgid "[updated] user" -msgstr "更新用户组 %s" +msgstr "[更新] 用户" #: rhodecode/lib/helpers.py:648 -#, fuzzy msgid "[created] users group" -msgstr "建立用户组 %s" +msgstr "[创建] 用户组" #: rhodecode/lib/helpers.py:650 -#, fuzzy msgid "[updated] users group" -msgstr "更新用户组 %s" +msgstr "[更新] 用户组" #: rhodecode/lib/helpers.py:652 msgid "[commented] on revision in repository" -msgstr "" +msgstr "[评论] 了版本库中的修订" #: rhodecode/lib/helpers.py:654 -#, fuzzy msgid "[commented] on pull request for" -msgstr "创建用户 %s" +msgstr "[评论] 拉取请求" #: rhodecode/lib/helpers.py:656 msgid "[closed] pull request for" -msgstr "" +msgstr "[关闭] 拉取请求" #: rhodecode/lib/helpers.py:658 msgid "[pushed] into" -msgstr "" +msgstr "[推送] 到" #: rhodecode/lib/helpers.py:660 msgid "[committed via RhodeCode] into repository" -msgstr "" +msgstr "[通过 RhodeCode 提交] 到版本库" #: rhodecode/lib/helpers.py:662 msgid "[pulled from remote] into repository" -msgstr "" +msgstr "[远程拉取] 到版本库" #: rhodecode/lib/helpers.py:664 msgid "[pulled] from" -msgstr "" +msgstr "[拉取] 自" #: rhodecode/lib/helpers.py:666 msgid "[started following] repository" -msgstr "" +msgstr "[开始关注] 版本库" #: rhodecode/lib/helpers.py:668 msgid "[stopped following] repository" -msgstr "" +msgstr "[停止关注] 版本库" #: rhodecode/lib/helpers.py:840 #, python-format msgid " and %s more" -msgstr "" +msgstr "还有 %s 个" #: rhodecode/lib/helpers.py:844 msgid "No Files" msgstr "没有文件" #: rhodecode/lib/utils2.py:335 -#, fuzzy, python-format +#, python-format msgid "%d year" msgid_plural "%d years" -msgstr[0] "年" +msgstr[0] "%d 年" #: rhodecode/lib/utils2.py:336 -#, fuzzy, python-format +#, python-format msgid "%d month" msgid_plural "%d months" -msgstr[0] "月" +msgstr[0] "%d 月" #: rhodecode/lib/utils2.py:337 -#, fuzzy, python-format +#, python-format msgid "%d day" msgid_plural "%d days" -msgstr[0] "日" +msgstr[0] "%d 天" #: rhodecode/lib/utils2.py:338 -#, fuzzy, python-format +#, python-format msgid "%d hour" msgid_plural "%d hours" -msgstr[0] "时" +msgstr[0] "%d 小时" #: rhodecode/lib/utils2.py:339 -#, fuzzy, python-format +#, python-format msgid "%d minute" msgid_plural "%d minutes" -msgstr[0] "分" +msgstr[0] "%d 分钟" #: rhodecode/lib/utils2.py:340 -#, fuzzy, python-format +#, python-format msgid "%d second" msgid_plural "%d seconds" -msgstr[0] "秒" +msgstr[0] "%d 秒" #: rhodecode/lib/utils2.py:355 -#, fuzzy, python-format +#, python-format msgid "%s ago" -msgstr "之前" +msgstr "%s 之前" #: rhodecode/lib/utils2.py:357 #, python-format msgid "%s and %s ago" -msgstr "" +msgstr "%s 零 %s 之前" #: rhodecode/lib/utils2.py:360 msgid "just now" -msgstr "现在" +msgstr "刚才" #: rhodecode/lib/celerylib/tasks.py:269 -#, fuzzy msgid "password reset link" -msgstr "密码重置链接已经发送" +msgstr "密码重置链接" #: rhodecode/model/comment.py:110 #, python-format msgid "on line %s" -msgstr "" +msgstr "在 %s 行" #: rhodecode/model/comment.py:157 msgid "[Mention]" -msgstr "" +msgstr "[提及]" #: rhodecode/model/db.py:1140 -#, fuzzy msgid "Repository no access" -msgstr "个版本库" +msgstr "无版本库访问权限" #: rhodecode/model/db.py:1141 -#, fuzzy msgid "Repository read access" -msgstr "这个版本库已经存在" +msgstr "版本库读取权限" #: rhodecode/model/db.py:1142 -#, fuzzy msgid "Repository write access" -msgstr "个版本库" +msgstr "版本库写入权限" #: rhodecode/model/db.py:1143 -#, fuzzy msgid "Repository admin access" -msgstr "个版本库" +msgstr "版本库管理权限" #: rhodecode/model/db.py:1145 -#, fuzzy msgid "Repositories Group no access" -msgstr "版本库组" +msgstr "无版本库组访问权限" #: rhodecode/model/db.py:1146 -#, fuzzy msgid "Repositories Group read access" -msgstr "版本库组" +msgstr "版本库组读取权限" #: rhodecode/model/db.py:1147 -#, fuzzy msgid "Repositories Group write access" -msgstr "版本库组" +msgstr "版本库组写入" #: rhodecode/model/db.py:1148 -#, fuzzy msgid "Repositories Group admin access" -msgstr "版本库组" +msgstr "版本库组管理权限" #: rhodecode/model/db.py:1150 -#, fuzzy msgid "RhodeCode Administrator" -msgstr "用户管理员" +msgstr "RhodeCode 管理员" #: rhodecode/model/db.py:1151 -#, fuzzy msgid "Repository creation disabled" -msgstr "建立版本库" +msgstr "禁用创建版本库" #: rhodecode/model/db.py:1152 -#, fuzzy msgid "Repository creation enabled" -msgstr "建立版本库" +msgstr "允许创建版本库" #: rhodecode/model/db.py:1153 -#, fuzzy msgid "Repository forking disabled" -msgstr "建立版本库" +msgstr "禁用分支 版本库" #: rhodecode/model/db.py:1154 -#, fuzzy msgid "Repository forking enabled" -msgstr "建立版本库" +msgstr "允许分支版本库" #: rhodecode/model/db.py:1155 -#, fuzzy msgid "Register disabled" -msgstr "禁用" +msgstr "禁用注册" #: rhodecode/model/db.py:1156 msgid "Register new user with RhodeCode with manual activation" -msgstr "" +msgstr "用手动激活注册新用户" #: rhodecode/model/db.py:1159 msgid "Register new user with RhodeCode with auto activation" -msgstr "" +msgstr "用自动激活注册新用户" #: rhodecode/model/db.py:1579 msgid "Not Reviewed" -msgstr "" +msgstr "未检视" #: rhodecode/model/db.py:1580 -#, fuzzy msgid "Approved" -msgstr "移除" +msgstr "已批准" #: rhodecode/model/db.py:1581 msgid "Rejected" -msgstr "" +msgstr "驳回" #: rhodecode/model/db.py:1582 msgid "Under Review" -msgstr "" +msgstr "检视中" #: rhodecode/model/forms.py:43 msgid "Please enter a login" @@ -1054,7 +1017,7 @@ msgstr "请登录" #: rhodecode/model/forms.py:44 #, python-format msgid "Enter a value %(min)i characters long or more" -msgstr "" +msgstr "输入一个不少于 %(min)i 个字符的值" #: rhodecode/model/forms.py:52 msgid "Please enter a password" @@ -1063,46 +1026,42 @@ msgstr "请输入密码" #: rhodecode/model/forms.py:53 #, python-format msgid "Enter %(min)i characters or more" -msgstr "" +msgstr "输入少于 %(min)i 个字符" #: rhodecode/model/notification.py:220 msgid "commented on commit" -msgstr "" +msgstr "评论了评论" #: rhodecode/model/notification.py:221 -#, fuzzy msgid "sent message" -msgstr "提交信息" +msgstr "发送信息" #: rhodecode/model/notification.py:222 msgid "mentioned you" -msgstr "" +msgstr "提到了你" #: rhodecode/model/notification.py:223 -#, fuzzy msgid "registered in RhodeCode" -msgstr "成功注册到 rhodecode" +msgstr "注册到 RhodeCode" #: rhodecode/model/notification.py:224 msgid "opened new pull request" -msgstr "" +msgstr "创建新的拉取请求" #: rhodecode/model/notification.py:225 msgid "commented on pull request" -msgstr "" +msgstr "评论了拉取请求" #: rhodecode/model/pull_request.py:84 #, python-format msgid "%(user)s wants you to review pull request #%(pr_id)s" -msgstr "" +msgstr "%(user)s 想要你检视拉取请求 #%(pr_id)s" #: rhodecode/model/scm.py:535 -#, fuzzy msgid "latest tip" -msgstr "最后登录" +msgstr "最后 tip 版本" #: rhodecode/model/user.py:230 -#, fuzzy msgid "new user registration" msgstr "[RhodeCode] 新用户注册" @@ -1116,71 +1075,73 @@ msgid "You can't remove this user since msgstr "由于是系统帐号,无法删除该用户" #: rhodecode/model/user.py:329 -#, fuzzy, python-format +#, python-format msgid "" -"user \"%s\" still owns %s repositories and cannot be removed. Switch " -"owners or remove those repositories. %s" -msgstr "由于该用户拥有版本库 %s 因而无法删除,请变更版本库所有者或删除版本库" +"user \"%s\" still owns %s repositories and cannot be removed. Switch owners " +"or remove those repositories. %s" +msgstr "" +"由于用户 \"%s\" 拥有版本库 %s 因而无法删除,请修改版本库所有者或删除版本" +"库。%s" #: rhodecode/model/validators.py:35 rhodecode/model/validators.py:36 msgid "Value cannot be an empty list" -msgstr "" +msgstr "值不能为空" #: rhodecode/model/validators.py:82 -#, fuzzy, python-format +#, python-format msgid "Username \"%(username)s\" already exists" -msgstr "该用户名已经存在" +msgstr "用户名称 %(username)s 已经存在" #: rhodecode/model/validators.py:84 #, python-format msgid "Username \"%(username)s\" is forbidden" -msgstr "" +msgstr "不允许用户名 \"%(username)s\"" #: rhodecode/model/validators.py:86 msgid "" -"Username may only contain alphanumeric characters underscores, periods or" -" dashes and must begin with alphanumeric character" -msgstr "只能使用字母、数字、下划线、小数点或减号作为用户名,且必须由数字或字母开头" +"Username may only contain alphanumeric characters underscores, periods or " +"dashes and must begin with alphanumeric character" +msgstr "" +"只能使用字母、数字、下划线、小数点或减号作为用户名,且必须由数字或字母开头" #: rhodecode/model/validators.py:114 -#, fuzzy, python-format +#, python-format msgid "Username %(username)s is not valid" -msgstr "用户或用户组名称无效" +msgstr "用户名称 %(username)s 无效" #: rhodecode/model/validators.py:133 -#, fuzzy msgid "Invalid users group name" -msgstr "无效用户名" +msgstr "无效的用户组名" #: rhodecode/model/validators.py:134 -#, fuzzy, python-format +#, python-format msgid "Users group \"%(usersgroup)s\" already exists" -msgstr "该用户组名称已经存在" +msgstr "用户组 \"%(usersgroup)s\" 已经存在" #: rhodecode/model/validators.py:136 msgid "" "users group name may only contain alphanumeric characters underscores, " "periods or dashes and must begin with alphanumeric character" -msgstr "只能使用字母、数字、下划线、小数点或减号作为用户组名,且必须由数字或字母开头" +msgstr "" +"只能使用字母、数字、下划线、小数点或减号作为用户组名,且必须由数字或字母开头" #: rhodecode/model/validators.py:174 msgid "Cannot assign this group as parent" -msgstr "" +msgstr "不能将这个组作为 parent" #: rhodecode/model/validators.py:175 -#, fuzzy, python-format +#, python-format msgid "Group \"%(group_name)s\" already exists" -msgstr "该用户名已经存在" +msgstr "组 \"%(group_name)s\" 已经存在" #: rhodecode/model/validators.py:177 -#, fuzzy, python-format +#, python-format msgid "Repository with name \"%(group_name)s\" already exists" -msgstr "这个版本库已经存在" +msgstr "已经存在名为 \"%(group_name)s\" 的版本库" #: rhodecode/model/validators.py:235 -#, fuzzy msgid "Invalid characters (non-ascii) in password" -msgstr "密码含有无效字符" +msgstr "密码含有无效(非ASCII)字符" #: rhodecode/model/validators.py:250 msgid "Passwords do not match" @@ -1199,37 +1160,36 @@ msgid "Your account is disabled" msgstr "该帐号已被禁用" #: rhodecode/model/validators.py:313 -#, fuzzy, python-format +#, python-format msgid "Repository name %(repo)s is disallowed" -msgstr "该版本库名称被禁用" +msgstr "版本库名称不能为 %(repo)s" #: rhodecode/model/validators.py:315 -#, fuzzy, python-format +#, python-format msgid "Repository named %(repo)s already exists" -msgstr "这个版本库已经存在" +msgstr "已经存在版本库 %(repo)s" #: rhodecode/model/validators.py:316 -#, fuzzy, python-format +#, python-format msgid "Repository \"%(repo)s\" already exists in group \"%(group)s\"" -msgstr "组中已经存在该版本库" +msgstr "版本库组 \"%(group)s\" 中已经存在版本库 \"%(repo)s\"" #: rhodecode/model/validators.py:318 -#, fuzzy, python-format +#, python-format msgid "Repositories group with name \"%(repo)s\" already exists" -msgstr "这个版本库已经存在" +msgstr "已经存在名为 \"%(repo)s\" 的版本库组" #: rhodecode/model/validators.py:431 msgid "invalid clone url" -msgstr "无效的 clone 地址" +msgstr "无效的克隆地址" #: rhodecode/model/validators.py:432 msgid "Invalid clone url, provide a valid clone http(s)/svn+http(s) url" -msgstr "" +msgstr "无效的克隆地址,提供一个有效的克隆 http(s) 或 svn+http(s) 地址" #: rhodecode/model/validators.py:457 -#, fuzzy msgid "Fork have to be the same type as parent" -msgstr "分支必须使用相同的版本库类型" +msgstr "分支必须使用和父版本库相同的类型" #: rhodecode/model/validators.py:478 msgid "This username or users group name is not valid" @@ -1244,24 +1204,24 @@ msgid "This e-mail address is already ta msgstr "该邮件地址已被使用" #: rhodecode/model/validators.py:597 -#, fuzzy, python-format +#, python-format msgid "e-mail \"%(email)s\" does not exist." -msgstr "该邮件地址不存在" +msgstr "邮件地址 \"%(email)s\" 不存在" #: rhodecode/model/validators.py:634 msgid "" -"The LDAP Login attribute of the CN must be specified - this is the name " -"of the attribute that is equivalent to \"username\"" -msgstr "" +"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 必须指定 - 这个名字作为用户名" #: rhodecode/model/validators.py:653 #, python-format msgid "Revisions %(revs)s are already part of pull request or have set status" -msgstr "" +msgstr "修订 %(revs)s 已经包含在拉取请求中或者或者已经设置状态" #: rhodecode/templates/index.html:3 msgid "Dashboard" -msgstr "" +msgstr "控制面板" #: rhodecode/templates/index_base.html:6 #: rhodecode/templates/repo_switcher_list.html:4 @@ -1285,7 +1245,7 @@ msgstr "个版本库" #: rhodecode/templates/index_base.html:15 #: rhodecode/templates/admin/repos/repos.html:21 msgid "ADD REPOSITORY" -msgstr "新增版本库" +msgstr "新建版本库" #: rhodecode/templates/index_base.html:29 #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:32 @@ -1351,7 +1311,7 @@ msgstr "最后修改" #: rhodecode/templates/admin/users/user_edit_my_account.html:159 #: rhodecode/templates/journal/journal.html:188 msgid "Tip" -msgstr "" +msgstr "Tip" #: rhodecode/templates/index_base.html:74 #: rhodecode/templates/index_base.html:173 @@ -1364,26 +1324,25 @@ msgstr "所有者" #: rhodecode/templates/summary/summary.html:48 #: rhodecode/templates/summary/summary.html:51 msgid "RSS" -msgstr "" +msgstr "RSS" #: rhodecode/templates/index_base.html:76 msgid "Atom" -msgstr "" +msgstr "Atom" #: rhodecode/templates/index_base.html:110 #: rhodecode/templates/index_base.html:112 #, python-format msgid "Subscribe to %s rss feed" -msgstr "订阅 rss %s" +msgstr "订阅 %s 的 RSS" #: rhodecode/templates/index_base.html:117 #: rhodecode/templates/index_base.html:119 #, python-format msgid "Subscribe to %s atom feed" -msgstr "订阅 atom %s" +msgstr "订阅 %s 的 Atom" #: rhodecode/templates/index_base.html:140 -#, fuzzy msgid "Group Name" msgstr "组名" @@ -1397,7 +1356,7 @@ msgstr "组名" #: rhodecode/templates/journal/journal.html:211 #: rhodecode/templates/tags/tags.html:60 msgid "Click to sort ascending" -msgstr "" +msgstr "点击以升序排列" #: rhodecode/templates/index_base.html:159 #: rhodecode/templates/index_base.html:199 @@ -1409,10 +1368,9 @@ msgstr "" #: rhodecode/templates/journal/journal.html:212 #: rhodecode/templates/tags/tags.html:61 msgid "Click to sort descending" -msgstr "" +msgstr "点击以降序排列" #: rhodecode/templates/index_base.html:169 -#, fuzzy msgid "Last Change" msgstr "最后修改" @@ -1425,7 +1383,7 @@ msgstr "最后修改" #: rhodecode/templates/journal/journal.html:213 #: rhodecode/templates/tags/tags.html:62 msgid "No records found." -msgstr "" +msgstr "没有找到记录" #: rhodecode/templates/index_base.html:201 #: rhodecode/templates/admin/repos/repos.html:97 @@ -1436,7 +1394,7 @@ msgstr "" #: rhodecode/templates/journal/journal.html:214 #: rhodecode/templates/tags/tags.html:63 msgid "Data error." -msgstr "" +msgstr "数据错误" #: rhodecode/templates/index_base.html:202 #: rhodecode/templates/admin/repos/repos.html:98 @@ -1446,9 +1404,8 @@ msgstr "" #: rhodecode/templates/branches/branches.html:81 #: rhodecode/templates/journal/journal.html:215 #: rhodecode/templates/tags/tags.html:64 -#, fuzzy msgid "Loading..." -msgstr "加载文件列表..." +msgstr "载入中..." #: rhodecode/templates/login.html:5 rhodecode/templates/login.html:54 msgid "Sign In" @@ -1476,9 +1433,8 @@ msgid "Password" msgstr "密码" #: rhodecode/templates/login.html:50 -#, fuzzy msgid "Remember me" -msgstr "成员" +msgstr "记住密码" #: rhodecode/templates/login.html:60 msgid "Forgot your password ?" @@ -1585,13 +1541,12 @@ msgstr "没有任何标签" #: rhodecode/templates/switch_to_list.html:28 #: rhodecode/templates/bookmarks/bookmarks.html:15 msgid "bookmarks" -msgstr "" +msgstr "书签" #: rhodecode/templates/switch_to_list.html:35 #: rhodecode/templates/bookmarks/bookmarks_data.html:32 -#, fuzzy msgid "There are no bookmarks yet" -msgstr "尚未有任何分支" +msgstr "无书签" #: rhodecode/templates/admin/admin.html:5 #: rhodecode/templates/admin/admin.html:9 @@ -1626,7 +1581,7 @@ msgstr "来源 IP" #: rhodecode/templates/admin/admin_log.html:53 msgid "No actions yet" -msgstr "尚无操作" +msgstr "无操作" #: rhodecode/templates/admin/ldap/ldap.html:5 msgid "LDAP administration" @@ -1634,7 +1589,7 @@ msgstr "LDAP 管理员" #: rhodecode/templates/admin/ldap/ldap.html:11 msgid "Ldap" -msgstr "" +msgstr "LDAP" #: rhodecode/templates/admin/ldap/ldap.html:28 msgid "Connection settings" @@ -1670,15 +1625,15 @@ msgstr "搜索设置" #: rhodecode/templates/admin/ldap/ldap.html:59 msgid "Base DN" -msgstr "" +msgstr "Base DN" #: rhodecode/templates/admin/ldap/ldap.html:63 msgid "LDAP Filter" -msgstr "" +msgstr "LDAP 过滤器" #: rhodecode/templates/admin/ldap/ldap.html:67 msgid "LDAP Search Scope" -msgstr "" +msgstr "LDAP 搜索范围" #: rhodecode/templates/admin/ldap/ldap.html:70 msgid "Attribute mappings" @@ -1715,42 +1670,38 @@ msgstr "保存" #: rhodecode/templates/admin/notifications/notifications.html:5 #: rhodecode/templates/admin/notifications/notifications.html:9 msgid "My Notifications" -msgstr "" +msgstr "我的通知" #: rhodecode/templates/admin/notifications/notifications.html:29 msgid "All" -msgstr "" +msgstr "全部" #: rhodecode/templates/admin/notifications/notifications.html:30 -#, fuzzy msgid "Comments" -msgstr "提交" +msgstr "评论" #: rhodecode/templates/admin/notifications/notifications.html:31 #: rhodecode/templates/base/base.html:254 #: rhodecode/templates/base/base.html:256 msgid "Pull requests" -msgstr "" +msgstr "拉取请求" #: rhodecode/templates/admin/notifications/notifications.html:35 msgid "Mark all read" -msgstr "" +msgstr "全部标记为已读" #: rhodecode/templates/admin/notifications/notifications_data.html:39 -#, fuzzy msgid "No notifications here yet" -msgstr "尚无操作" +msgstr "无通知" #: rhodecode/templates/admin/notifications/show_notification.html:5 #: rhodecode/templates/admin/notifications/show_notification.html:11 -#, fuzzy msgid "Show notification" -msgstr "显示注释" +msgstr "显示通知" #: rhodecode/templates/admin/notifications/show_notification.html:9 -#, fuzzy msgid "Notifications" -msgstr "位置" +msgstr "通知" #: rhodecode/templates/admin/permissions/permissions.html:5 msgid "Permissions administration" @@ -1780,9 +1731,10 @@ msgstr "版本库权限" #: rhodecode/templates/admin/permissions/permissions.html:49 msgid "" "All default permissions on each repository will be reset to choosen " -"permission, note that all custom default permission on repositories will " -"be lost" +"permission, note that all custom default permission on repositories will be " +"lost" msgstr "" +"所有版本库的默认权限将被重置到选择的权限,所有版本库的自定义权限将被丢弃" #: rhodecode/templates/admin/permissions/permissions.html:50 msgid "overwrite existing settings" @@ -1797,9 +1749,8 @@ msgid "Repository creation" msgstr "建立版本库" #: rhodecode/templates/admin/permissions/permissions.html:71 -#, fuzzy msgid "Repository forking" -msgstr "建立版本库" +msgstr "版本库分支" #: rhodecode/templates/admin/permissions/permissions.html:78 #: rhodecode/templates/admin/repos/repo_edit.html:241 @@ -1819,19 +1770,19 @@ msgstr "版本库" #: rhodecode/templates/admin/repos/repo_add.html:13 msgid "add new" -msgstr "新增" +msgstr "新建" #: rhodecode/templates/admin/repos/repo_add_base.html:20 #: rhodecode/templates/summary/summary.html:95 #: rhodecode/templates/summary/summary.html:96 msgid "Clone from" -msgstr "clone 自" +msgstr "克隆自" #: rhodecode/templates/admin/repos/repo_add_base.html:24 #: rhodecode/templates/admin/repos/repo_edit.html:44 #: rhodecode/templates/settings/repo_settings.html:43 msgid "Optional http[s] url from which repository should be cloned." -msgstr "" +msgstr "可选的,指定版本库应该从哪个 http[s] 地址克隆。" #: rhodecode/templates/admin/repos/repo_add_base.html:29 #: rhodecode/templates/admin/repos/repo_edit.html:49 @@ -1844,7 +1795,7 @@ msgstr "版本库组" #: rhodecode/templates/admin/repos/repo_add_base.html:33 #: rhodecode/templates/forks/fork.html:54 msgid "Optionaly select a group to put this repository into." -msgstr "" +msgstr "可选的,选择一个组将版本库放到其中" #: rhodecode/templates/admin/repos/repo_add_base.html:38 #: rhodecode/templates/admin/repos/repo_edit.html:58 @@ -1852,31 +1803,30 @@ msgid "Type" msgstr "类型" #: rhodecode/templates/admin/repos/repo_add_base.html:42 -#, fuzzy msgid "Type of repository to create." -msgstr "建立版本库" +msgstr "要创建的版本库类型" #: rhodecode/templates/admin/repos/repo_add_base.html:47 #: rhodecode/templates/admin/repos/repo_edit.html:66 #: rhodecode/templates/forks/fork.html:41 #: rhodecode/templates/settings/repo_settings.html:57 -#, fuzzy msgid "Landing revision" -msgstr "下一个修订" +msgstr "默认修订" #: rhodecode/templates/admin/repos/repo_add_base.html:51 #: rhodecode/templates/admin/repos/repo_edit.html:70 #: rhodecode/templates/forks/fork.html:45 #: rhodecode/templates/settings/repo_settings.html:61 msgid "Default revision for files page, downloads, whoosh and readme" -msgstr "" +msgstr "文件浏览、下载、whoosh和readme的默认修订版本" #: rhodecode/templates/admin/repos/repo_add_base.html:60 #: rhodecode/templates/admin/repos/repo_edit.html:79 #: rhodecode/templates/forks/fork.html:63 #: rhodecode/templates/settings/repo_settings.html:70 -msgid "Keep it short and to the point. Use a README file for longer descriptions." -msgstr "" +msgid "" +"Keep it short and to the point. Use a README file for longer descriptions." +msgstr "保持简短。用 README 文件来写更长的描述。" #: rhodecode/templates/admin/repos/repo_add_base.html:69 #: rhodecode/templates/admin/repos/repo_edit.html:89 @@ -1885,15 +1835,15 @@ msgstr "" msgid "" "Private repositories are only visible to people explicitly added as " "collaborators." -msgstr "" +msgstr "私有版本库只对显示添加的合作者可见。" #: rhodecode/templates/admin/repos/repo_add_base.html:73 msgid "add" -msgstr "新增" +msgstr "新建" #: rhodecode/templates/admin/repos/repo_add_create_repository.html:9 msgid "add new repository" -msgstr "新增版本库" +msgstr "新建版本库" #: rhodecode/templates/admin/repos/repo_edit.html:5 msgid "Edit repository" @@ -1913,12 +1863,12 @@ msgstr "编辑" #: rhodecode/templates/admin/repos/repo_edit.html:40 #: rhodecode/templates/settings/repo_settings.html:39 msgid "Clone uri" -msgstr "clone 地址" +msgstr "克隆地址" #: rhodecode/templates/admin/repos/repo_edit.html:53 #: rhodecode/templates/settings/repo_settings.html:52 msgid "Optional select a group to put this repository into." -msgstr "" +msgstr "可选的,选择一个组将版本库放到其中" #: rhodecode/templates/admin/repos/repo_edit.html:94 msgid "Enable statistics" @@ -1926,7 +1876,7 @@ msgstr "启用统计" #: rhodecode/templates/admin/repos/repo_edit.html:98 msgid "Enable statistics window on summary page." -msgstr "" +msgstr "启用概况页的统计窗口" #: rhodecode/templates/admin/repos/repo_edit.html:103 msgid "Enable downloads" @@ -1934,22 +1884,20 @@ msgstr "启用下载" #: rhodecode/templates/admin/repos/repo_edit.html:107 msgid "Enable download menu on summary page." -msgstr "" +msgstr "启用概况页的下载菜单" #: rhodecode/templates/admin/repos/repo_edit.html:112 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:66 -#, fuzzy msgid "Enable locking" -msgstr "启用" +msgstr "启用锁定" #: rhodecode/templates/admin/repos/repo_edit.html:116 msgid "Enable lock-by-pulling on repository." -msgstr "" +msgstr "启用版本库的拉取锁定" #: rhodecode/templates/admin/repos/repo_edit.html:126 -#, fuzzy msgid "Change owner of this repository." -msgstr "%s 库的修改" +msgstr "修改这个版本库的所有者" #: rhodecode/templates/admin/repos/repo_edit.html:142 #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:75 @@ -1986,11 +1934,11 @@ msgstr "确认移除当前统计" #: rhodecode/templates/admin/repos/repo_edit.html:162 msgid "Fetched to rev" -msgstr "" +msgstr "获取到修订" #: rhodecode/templates/admin/repos/repo_edit.html:163 msgid "Stats gathered" -msgstr "" +msgstr "已收集的统计" #: rhodecode/templates/admin/repos/repo_edit.html:171 msgid "Remote" @@ -1998,11 +1946,11 @@ msgstr "远程" #: rhodecode/templates/admin/repos/repo_edit.html:175 msgid "Pull changes from remote location" -msgstr "" +msgstr "从远程路径拉取修订集" #: rhodecode/templates/admin/repos/repo_edit.html:175 msgid "Confirm to pull changes from remote side" -msgstr "" +msgstr "确认从远程拉取修订集" #: rhodecode/templates/admin/repos/repo_edit.html:186 msgid "Cache" @@ -2010,7 +1958,7 @@ msgstr "缓存" #: rhodecode/templates/admin/repos/repo_edit.html:190 msgid "Invalidate repository cache" -msgstr "" +msgstr "清除版本库缓存" #: rhodecode/templates/admin/repos/repo_edit.html:190 msgid "Confirm to invalidate repository cache" @@ -2033,49 +1981,46 @@ msgstr "添加到公共日志" #: rhodecode/templates/admin/repos/repo_edit.html:208 msgid "" -"All actions made on this repository will be accessible to everyone in " -"public journal" -msgstr "" +"All actions made on this repository will be accessible to everyone in public " +"journal" +msgstr "任何人都可以在公共日志上看到这个版本库上的所有动作" #: rhodecode/templates/admin/repos/repo_edit.html:215 -#, fuzzy msgid "Locking" -msgstr "解锁" +msgstr "锁定" #: rhodecode/templates/admin/repos/repo_edit.html:220 msgid "Unlock locked repo" -msgstr "" +msgstr "解锁版本库" #: rhodecode/templates/admin/repos/repo_edit.html:220 -#, fuzzy msgid "Confirm to unlock repository" -msgstr "确认删除版本库" +msgstr "确认解锁版本库" #: rhodecode/templates/admin/repos/repo_edit.html:223 msgid "lock repo" -msgstr "" +msgstr "锁定版本库" #: rhodecode/templates/admin/repos/repo_edit.html:223 -#, fuzzy msgid "Confirm to lock repository" -msgstr "确认删除版本库" +msgstr "确认锁定版本库" #: rhodecode/templates/admin/repos/repo_edit.html:224 -#, fuzzy msgid "Repository is not locked" -msgstr "个版本库" +msgstr "版本库未锁定" #: rhodecode/templates/admin/repos/repo_edit.html:229 -msgid "Force locking on repository. Works only when anonymous access is disabled" -msgstr "" +msgid "" +"Force locking on repository. Works only when anonymous access is disabled" +msgstr "强制锁定版本库。只有在禁止匿名访问时候才有效" #: rhodecode/templates/admin/repos/repo_edit.html:236 msgid "Set as fork of" -msgstr "" +msgstr "设置 fork 自" #: rhodecode/templates/admin/repos/repo_edit.html:245 msgid "Manually set this repository as a fork of another from the list" -msgstr "" +msgstr "从列表中手动设置这个版本库 fork 自另一版本库" #: rhodecode/templates/admin/repos/repo_edit.html:251 #: rhodecode/templates/changeset/changeset_file_comment.html:26 @@ -2093,11 +2038,13 @@ msgstr "确认删除版本库" #: rhodecode/templates/admin/repos/repo_edit.html:259 msgid "" -"This repository will be renamed in a special way in order to be " -"unaccesible for RhodeCode and VCS systems.\n" -" If you need fully delete it from filesystem " -"please do it manually" +"This repository will be renamed in a special way in order to be unaccesible " +"for RhodeCode and VCS systems.\n" +" If you need fully delete it from filesystem please " +"do it manually" msgstr "" +"这个版本库将以特殊的方式重命名这样 RhodeCode 和版本控制系统将不能访问它。\n" +" 如果需要从文件系统完全删除,你需要手动操作" #: rhodecode/templates/admin/repos/repo_edit_perms.html:3 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:3 @@ -2136,16 +2083,15 @@ msgstr "私有版本库" #: rhodecode/templates/admin/repos/repo_edit_perms.html:19 #: rhodecode/templates/admin/repos/repo_edit_perms.html:28 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:18 -#, fuzzy msgid "default" -msgstr "删除" +msgstr "默认" #: rhodecode/templates/admin/repos/repo_edit_perms.html:33 #: rhodecode/templates/admin/repos/repo_edit_perms.html:58 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:23 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:42 msgid "revoke" -msgstr "" +msgstr "移除" #: rhodecode/templates/admin/repos/repo_edit_perms.html:83 #: rhodecode/templates/admin/repos_groups/repos_group_edit_perms.html:67 @@ -2172,7 +2118,7 @@ msgstr "组" #: rhodecode/templates/admin/repos_groups/repos_groups.html:12 msgid "with" -msgstr "" +msgstr "有" #: rhodecode/templates/admin/repos_groups/repos_groups_add.html:5 msgid "Add repos group" @@ -2210,9 +2156,9 @@ msgstr "编辑版本库组" #: rhodecode/templates/admin/repos_groups/repos_groups_edit.html:70 msgid "" -"Enable lock-by-pulling on group. This option will be applied to all other" -" groups and repositories inside" -msgstr "" +"Enable lock-by-pulling on group. This option will be applied to all other " +"groups and repositories inside" +msgstr "启用组的拉取锁定。这个选项将应用到组内的其他组和版本库" #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:5 msgid "Repositories groups administration" @@ -2223,9 +2169,8 @@ msgid "ADD NEW GROUP" msgstr "添加组" #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:35 -#, fuzzy msgid "Number of toplevel repositories" -msgstr "版本库数量" +msgstr "顶层版本库数量" #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:36 #: rhodecode/templates/admin/users/users.html:87 @@ -2242,9 +2187,9 @@ msgid "delete" msgstr "删除" #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:54 -#, fuzzy, python-format +#, python-format msgid "Confirm to delete this group: %s" -msgstr "确认删除该组" +msgstr "确认删除该版本库组: %s" #: rhodecode/templates/admin/repos_groups/repos_groups_show.html:62 msgid "There are no repositories groups yet" @@ -2287,10 +2232,11 @@ msgstr "重新扫描选项" #: rhodecode/templates/admin/settings/settings.html:38 msgid "" -"In case a repository was deleted from filesystem and there are leftovers " -"in the database check this option to scan obsolete data in database and " -"remove it." -msgstr "如果版本库已经从文件系统删除,但数据库仍然有遗留信息,请勾选该项进行清理" +"In case a repository was deleted from filesystem and there are leftovers in " +"the database check this option to scan obsolete data in database and remove " +"it." +msgstr "" +"如果版本库已经从文件系统删除,但数据库仍然有遗留信息,请勾选该项进行清理" #: rhodecode/templates/admin/settings/settings.html:39 msgid "destroy old data" @@ -2298,9 +2244,10 @@ msgstr "清理旧数据" #: rhodecode/templates/admin/settings/settings.html:41 msgid "" -"Rescan repositories location for new repositories. Also deletes obsolete " -"if `destroy` flag is checked " +"Rescan repositories location for new repositories. Also deletes obsolete if " +"`destroy` flag is checked " msgstr "" +"重新扫描版本库路径以发现新版本库。 同时删除过时的,如果设置有 `destroy` 标志" #: rhodecode/templates/admin/settings/settings.html:46 msgid "Rescan repositories" @@ -2332,11 +2279,11 @@ msgstr "应用名称" #: rhodecode/templates/admin/settings/settings.html:95 msgid "Realm text" -msgstr "" +msgstr "Realm text" #: rhodecode/templates/admin/settings/settings.html:104 msgid "GA code" -msgstr "" +msgstr "GA code" #: rhodecode/templates/admin/settings/settings.html:112 #: rhodecode/templates/admin/settings/settings.html:167 @@ -2345,56 +2292,52 @@ msgid "Save settings" msgstr "保存设置" #: rhodecode/templates/admin/settings/settings.html:119 -#, fuzzy msgid "Visualisation settings" -msgstr "全局设置" +msgstr "可视化设置" #: rhodecode/templates/admin/settings/settings.html:128 -#, fuzzy msgid "Icons" -msgstr "选项" +msgstr "图标" #: rhodecode/templates/admin/settings/settings.html:133 msgid "Show public repo icon on repositories" -msgstr "" +msgstr "显示公共版本库图标" #: rhodecode/templates/admin/settings/settings.html:137 -#, fuzzy msgid "Show private repo icon on repositories" -msgstr "私有版本库" +msgstr "显示私有版本库图标" #: rhodecode/templates/admin/settings/settings.html:144 -#, fuzzy msgid "Meta-Tagging" -msgstr "设置" +msgstr "元标记" #: rhodecode/templates/admin/settings/settings.html:149 msgid "Stylify recognised metatags:" -msgstr "" +msgstr "样式化识别的元标记" #: rhodecode/templates/admin/settings/settings.html:176 -#, fuzzy msgid "VCS settings" -msgstr "设置" +msgstr "版本控制系统设置" #: rhodecode/templates/admin/settings/settings.html:185 msgid "Web" -msgstr "" +msgstr "网络" #: rhodecode/templates/admin/settings/settings.html:190 -#, fuzzy msgid "require ssl for vcs operations" -msgstr "使用 SSL 推送" +msgstr "要求使用 SSL进行版本控制系统操作" #: rhodecode/templates/admin/settings/settings.html:192 msgid "" -"RhodeCode will require SSL for pushing or pulling. If SSL is missing it " -"will return HTTP Error 406: Not Acceptable" +"RhodeCode will require SSL for pushing or pulling. If SSL is missing it will " +"return HTTP Error 406: Not Acceptable" msgstr "" +"勾选后 RhodeCode 将要求使用 SSL 进行推送和拉取。如果没有使用 SSL 将返回 HTTP " +"406错误:Not Acceptable" #: rhodecode/templates/admin/settings/settings.html:198 msgid "Hooks" -msgstr "" +msgstr "钩子" #: rhodecode/templates/admin/settings/settings.html:203 msgid "Update repository after push (hg update)" @@ -2417,23 +2360,22 @@ msgid "advanced setup" msgstr "高级设置" #: rhodecode/templates/admin/settings/settings.html:224 -#, fuzzy msgid "Mercurial Extensions" -msgstr "Mercurial 版本库" +msgstr "Mercurial 扩展" #: rhodecode/templates/admin/settings/settings.html:229 msgid "largefiles extensions" -msgstr "" +msgstr "大文件扩展" #: rhodecode/templates/admin/settings/settings.html:233 msgid "hgsubversion extensions" -msgstr "" +msgstr "hgsubversion 扩展" #: rhodecode/templates/admin/settings/settings.html:235 msgid "" "Requires hgsubversion library installed. Allows clonning from svn remote " "locations" -msgstr "" +msgstr " 允许从远程 svn 地址克隆。需要安装 hgsubversion 库" #: rhodecode/templates/admin/settings/settings.html:245 msgid "Repositories location" @@ -2442,8 +2384,8 @@ msgstr "版本库路径" #: rhodecode/templates/admin/settings/settings.html:250 msgid "" "This a crucial application setting. If you are really sure you need to " -"change this, you must restart application in order to make this setting " -"take effect. Click this label to unlock." +"change this, you must restart application in order to make this setting take " +"effect. Click this label to unlock." msgstr "这是一个关键设置。如果确认修改该项设置,请重启服务以便设置生效。" #: rhodecode/templates/admin/settings/settings.html:251 @@ -2452,30 +2394,27 @@ msgstr "解锁" #: rhodecode/templates/admin/settings/settings.html:252 msgid "" -"Location where repositories are stored. After changing this value a " -"restart, and rescan is required" -msgstr "" +"Location where repositories are stored. After changing this value a restart, " +"and rescan is required" +msgstr "版本库存储路径。 修改后需要重启和重新扫描" #: rhodecode/templates/admin/settings/settings.html:272 msgid "Test Email" -msgstr "" +msgstr "测试邮件" #: rhodecode/templates/admin/settings/settings.html:280 -#, fuzzy msgid "Email to" -msgstr "电子邮件" +msgstr "发送到" #: rhodecode/templates/admin/settings/settings.html:288 -#, fuzzy msgid "Send" -msgstr "秒" +msgstr "发送" #: rhodecode/templates/admin/settings/settings.html:294 msgid "System Info and Packages" -msgstr "" +msgstr "系统和软件包信息" #: rhodecode/templates/admin/settings/settings.html:297 -#, fuzzy msgid "show" msgstr "显示" @@ -2493,9 +2432,8 @@ msgid "add new user" msgstr "添加新用户" #: rhodecode/templates/admin/users/user_add.html:50 -#, fuzzy msgid "Password confirmation" -msgstr "密码不符" +msgstr "确认密码" #: rhodecode/templates/admin/users/user_add.html:86 #: rhodecode/templates/admin/users/user_edit.html:113 @@ -2521,11 +2459,11 @@ msgstr "使用中" #: rhodecode/templates/admin/users/user_edit.html:43 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:20 msgid "API key" -msgstr "" +msgstr "API 密钥" #: rhodecode/templates/admin/users/user_edit.html:59 msgid "LDAP DN" -msgstr "" +msgstr "LDAP DN" #: rhodecode/templates/admin/users/user_edit.html:68 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:35 @@ -2535,13 +2473,12 @@ msgstr "新密码" #: rhodecode/templates/admin/users/user_edit.html:77 #: rhodecode/templates/admin/users/user_edit_my_account_form.html:44 msgid "New password confirmation" -msgstr "" +msgstr "确认新密码" #: rhodecode/templates/admin/users/user_edit.html:147 #: rhodecode/templates/admin/users_groups/users_group_edit.html:108 -#, fuzzy msgid "Inherit default permissions" -msgstr "默认权限" +msgstr "继承默认权限" #: rhodecode/templates/admin/users/user_edit.html:152 #: rhodecode/templates/admin/users_groups/users_group_edit.html:113 @@ -2549,7 +2486,7 @@ msgstr "默认权限" msgid "" "Select to inherit permissions from %s settings. With this selected below " "options does not have any action" -msgstr "" +msgstr "勾选以从 %s 继承权限设置。 勾选后下面的选项将不起作用" #: rhodecode/templates/admin/users/user_edit.html:158 #: rhodecode/templates/admin/users_groups/users_group_edit.html:119 @@ -2558,48 +2495,41 @@ msgstr "创建版本库" #: rhodecode/templates/admin/users/user_edit.html:166 #: rhodecode/templates/admin/users_groups/users_group_edit.html:127 -#, fuzzy msgid "Fork repositories" -msgstr "个版本库" +msgstr "分支版本库" #: rhodecode/templates/admin/users/user_edit.html:186 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:22 #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:39 -#, fuzzy msgid "Nothing here yet" -msgstr "尚无操作" +msgstr "无条目" #: rhodecode/templates/admin/users/user_edit.html:193 #: rhodecode/templates/admin/users/user_edit_my_account.html:60 #: rhodecode/templates/admin/users/user_edit_my_account.html:194 -#, fuzzy msgid "Permission" msgstr "权限" #: rhodecode/templates/admin/users/user_edit.html:194 -#, fuzzy msgid "Edit Permission" -msgstr "版本库权限" +msgstr "编辑权限" #: rhodecode/templates/admin/users/user_edit.html:243 -#, fuzzy msgid "Email addresses" msgstr "邮件地址" #: rhodecode/templates/admin/users/user_edit.html:256 -#, fuzzy, python-format +#, python-format msgid "Confirm to delete this email: %s" -msgstr "确认删除该用户" +msgstr "确认删除邮件地址: %s" #: rhodecode/templates/admin/users/user_edit.html:270 -#, fuzzy msgid "New email address" -msgstr "邮件地址" +msgstr "增加邮件地址" #: rhodecode/templates/admin/users/user_edit.html:277 -#, fuzzy msgid "Add" -msgstr "新增" +msgstr "增加" #: rhodecode/templates/admin/users/user_edit_my_account.html:5 #: rhodecode/templates/base/base.html:124 @@ -2611,49 +2541,44 @@ msgid "My Account" msgstr "我的账户" #: rhodecode/templates/admin/users/user_edit_my_account.html:35 -#, fuzzy msgid "My permissions" -msgstr "权限" +msgstr "我的权限" #: rhodecode/templates/admin/users/user_edit_my_account.html:38 #: rhodecode/templates/journal/journal.html:41 -#, fuzzy msgid "My repos" -msgstr "空版本库" +msgstr "我的版本库" #: rhodecode/templates/admin/users/user_edit_my_account.html:41 -#, fuzzy msgid "My pull requests" -msgstr "创建用户 %s" +msgstr "我的拉取请求" #: rhodecode/templates/admin/users/user_edit_my_account.html:45 -#, fuzzy msgid "Add repo" -msgstr "新增" +msgstr "新建版本库" #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:2 msgid "Opened by me" -msgstr "" +msgstr "我创建的" #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:10 #, python-format msgid "Pull request #%s opened on %s" -msgstr "" +msgstr "拉取请求 #%s 创建于 %s" #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:15 -#, fuzzy msgid "Confirm to delete this pull request" -msgstr "确认删除版本库" +msgstr "确认删除拉取请求" #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:26 msgid "I participate in" -msgstr "" +msgstr "我参与的" #: rhodecode/templates/admin/users/user_edit_my_account_pullrequests.html:33 #: rhodecode/templates/pullrequests/pullrequest_show_all.html:30 #, python-format msgid "Pull request #%s opened by %s on %s" -msgstr "" +msgstr "拉取请求 #%s 由 %s 创建于 %s" #: rhodecode/templates/admin/users/user_edit_my_account_repos.html:7 #: rhodecode/templates/bookmarks/bookmarks.html:40 @@ -2672,9 +2597,9 @@ msgstr "私有" #: rhodecode/templates/admin/users/user_edit_my_account_repos.html:31 #: rhodecode/templates/data_table/_dt_elements.html:7 -#, fuzzy, python-format +#, python-format msgid "Confirm to delete this repository: %s" -msgstr "确认删除版本库" +msgstr "确认删除版本库: %s" #: rhodecode/templates/admin/users/user_edit_my_account_repos.html:38 #: rhodecode/templates/journal/journal.html:94 @@ -2684,7 +2609,7 @@ msgstr "没有任何版本库" #: rhodecode/templates/admin/users/user_edit_my_account_repos.html:40 #: rhodecode/templates/journal/journal.html:96 msgid "create one now" -msgstr "" +msgstr "创建一个" #: rhodecode/templates/admin/users/users.html:5 msgid "Users administration" @@ -2704,7 +2629,6 @@ msgid "username" msgstr "用户名" #: rhodecode/templates/admin/users/users.html:80 -#, fuzzy msgid "firstname" msgstr "名" @@ -2724,7 +2648,7 @@ msgstr "启用" #: rhodecode/templates/admin/users/users.html:86 #: rhodecode/templates/base/base.html:226 msgid "ldap" -msgstr "" +msgstr "LDAP" #: rhodecode/templates/admin/users_groups/users_group_add.html:5 msgid "Add users group" @@ -2768,9 +2692,8 @@ msgid "Add all elements" msgstr "添加全部项目" #: rhodecode/templates/admin/users_groups/users_group_edit.html:146 -#, fuzzy msgid "Group members" -msgstr "选择组成员" +msgstr "拥护者成员" #: rhodecode/templates/admin/users_groups/users_groups.html:5 msgid "Users groups administration" @@ -2790,9 +2713,9 @@ msgid "members" msgstr "成员" #: rhodecode/templates/admin/users_groups/users_groups.html:45 -#, fuzzy, python-format +#, python-format msgid "Confirm to delete this users group: %s" -msgstr "确认删除该组" +msgstr "确认删除该组: %s" #: rhodecode/templates/base/base.html:41 msgid "Submit a bug" @@ -2800,20 +2723,19 @@ msgstr "提交 bug" #: rhodecode/templates/base/base.html:77 msgid "Login to your account" -msgstr "" +msgstr "登录" #: rhodecode/templates/base/base.html:100 msgid "Forgot password ?" msgstr "忘记密码?" #: rhodecode/templates/base/base.html:107 -#, fuzzy msgid "Log In" msgstr "登录" #: rhodecode/templates/base/base.html:118 msgid "Inbox" -msgstr "" +msgstr "收件箱" #: rhodecode/templates/base/base.html:122 #: rhodecode/templates/base/base.html:300 @@ -2830,7 +2752,8 @@ msgstr "" #: rhodecode/templates/files/files_add.html:15 #: rhodecode/templates/files/files_edit.html:15 #: rhodecode/templates/followers/followers.html:9 -#: rhodecode/templates/forks/fork.html:9 rhodecode/templates/forks/forks.html:9 +#: rhodecode/templates/forks/fork.html:9 +#: rhodecode/templates/forks/forks.html:9 #: rhodecode/templates/pullrequests/pullrequest.html:8 #: rhodecode/templates/pullrequests/pullrequest_show.html:8 #: rhodecode/templates/pullrequests/pullrequest_show_all.html:8 @@ -2861,12 +2784,12 @@ msgstr "切换版本库" #: rhodecode/templates/base/base.html:146 msgid "Products" -msgstr "" +msgstr "产品" #: rhodecode/templates/base/base.html:152 #: rhodecode/templates/base/base.html:182 msgid "loading..." -msgstr "" +msgstr "载入中..." #: rhodecode/templates/base/base.html:158 #: rhodecode/templates/base/base.html:160 @@ -2885,7 +2808,7 @@ msgstr "概况" #: rhodecode/templates/data_table/_dt_elements.html:25 #: rhodecode/templates/data_table/_dt_elements.html:27 msgid "Changelog" -msgstr "修改记录" +msgstr "修订记录" #: rhodecode/templates/base/base.html:175 #: rhodecode/templates/base/base.html:177 @@ -2900,7 +2823,7 @@ msgstr "切换到" #: rhodecode/templates/data_table/_dt_elements.html:33 #: rhodecode/templates/data_table/_dt_elements.html:35 msgid "Files" -msgstr "档案" +msgstr "浏览" #: rhodecode/templates/base/base.html:195 #: rhodecode/templates/base/base.html:199 @@ -2917,12 +2840,12 @@ msgstr "设置" #: rhodecode/templates/data_table/_dt_elements.html:80 #: rhodecode/templates/forks/fork.html:13 msgid "fork" -msgstr "" +msgstr "分支" #: rhodecode/templates/base/base.html:211 #: rhodecode/templates/changelog/changelog.html:40 msgid "Open new pull request" -msgstr "" +msgstr "新建拉取请求" #: rhodecode/templates/base/base.html:213 msgid "search" @@ -2943,12 +2866,12 @@ msgstr "权限" #: rhodecode/templates/base/base.html:238 #: rhodecode/templates/base/base.html:240 msgid "Followers" -msgstr "跟随者" +msgstr "关注者" #: rhodecode/templates/base/base.html:246 #: rhodecode/templates/base/base.html:248 msgid "Forks" -msgstr "" +msgstr "分支" #: rhodecode/templates/base/base.html:327 #: rhodecode/templates/base/base.html:329 @@ -2958,20 +2881,19 @@ msgid "Search" msgstr "搜索" #: rhodecode/templates/base/root.html:42 -#, fuzzy msgid "add another comment" -msgstr "添加成员" +msgstr "添加新的评论" #: rhodecode/templates/base/root.html:43 #: rhodecode/templates/journal/journal.html:120 #: rhodecode/templates/summary/summary.html:57 msgid "Stop following this repository" -msgstr "停止跟随该版本库" +msgstr "停止关注该版本库" #: rhodecode/templates/base/root.html:44 #: rhodecode/templates/summary/summary.html:61 msgid "Start following this repository" -msgstr "开始跟随该版本库" +msgstr "开始关注该版本库" #: rhodecode/templates/base/root.html:45 msgid "Group" @@ -2979,7 +2901,7 @@ msgstr "组" #: rhodecode/templates/base/root.html:47 msgid "search truncated" -msgstr "" +msgstr "搜索被截断" #: rhodecode/templates/base/root.html:48 msgid "no matching files" @@ -2988,31 +2910,28 @@ msgstr "没有符合的文件" #: rhodecode/templates/bookmarks/bookmarks.html:5 #, python-format msgid "%s Bookmarks" -msgstr "" +msgstr "%s 书签" #: rhodecode/templates/bookmarks/bookmarks.html:39 #: rhodecode/templates/bookmarks/bookmarks_data.html:8 #: rhodecode/templates/branches/branches.html:54 #: rhodecode/templates/tags/tags.html:39 #: rhodecode/templates/tags/tags_data.html:8 -#, fuzzy msgid "Author" msgstr "作者" #: rhodecode/templates/branches/branches.html:5 -#, fuzzy, python-format +#, python-format msgid "%s Branches" -msgstr "分支" +msgstr "%s 分支" #: rhodecode/templates/branches/branches.html:29 -#, fuzzy msgid "Compare branches" -msgstr "分支" +msgstr "比较分支" #: rhodecode/templates/branches/branches.html:57 #: rhodecode/templates/compare/compare_diff.html:5 #: rhodecode/templates/compare/compare_diff.html:13 -#, fuzzy msgid "Compare" msgstr "比较显示" @@ -3035,31 +2954,30 @@ msgid "revision" msgstr "修订" #: rhodecode/templates/branches/branches_data.html:10 -#, fuzzy msgid "compare" msgstr "比较显示" #: rhodecode/templates/changelog/changelog.html:6 -#, fuzzy, python-format +#, python-format msgid "%s Changelog" -msgstr "修改记录" +msgstr "%s 修订记录" #: rhodecode/templates/changelog/changelog.html:15 #, python-format msgid "showing %d out of %d revision" msgid_plural "showing %d out of %d revisions" -msgstr[0] "" +msgstr[0] "显示 %2d 中的 %1d 个版本" #: rhodecode/templates/changelog/changelog.html:37 #: rhodecode/templates/forks/forks_data.html:19 #, python-format msgid "compare fork with %s" -msgstr "" +msgstr "与 %s 比较" #: rhodecode/templates/changelog/changelog.html:37 #: rhodecode/templates/forks/forks_data.html:21 msgid "Compare fork" -msgstr "" +msgstr "比较分支" #: rhodecode/templates/changelog/changelog.html:46 msgid "Show" @@ -3068,33 +2986,32 @@ msgstr "显示" #: rhodecode/templates/changelog/changelog.html:72 #: rhodecode/templates/summary/summary.html:364 msgid "show more" -msgstr "" +msgstr "显示更多" #: rhodecode/templates/changelog/changelog.html:76 msgid "Affected number of files, click to show more details" -msgstr "" +msgstr "影响的文件数,点击显示详细信息" #: rhodecode/templates/changelog/changelog.html:89 #: rhodecode/templates/changeset/changeset.html:38 #: rhodecode/templates/changeset/changeset_file_comment.html:20 #: rhodecode/templates/changeset/changeset_range.html:46 -#, fuzzy msgid "Changeset status" -msgstr "变更集" +msgstr "修订集状态" #: rhodecode/templates/changelog/changelog.html:92 msgid "Click to open associated pull request" -msgstr "" +msgstr "点击建立相关的拉取请求" #: rhodecode/templates/changelog/changelog.html:102 #: rhodecode/templates/changeset/changeset.html:78 msgid "Parent" -msgstr "" +msgstr "父版本" #: rhodecode/templates/changelog/changelog.html:108 #: rhodecode/templates/changeset/changeset.html:84 msgid "No parents" -msgstr "" +msgstr "无父版本" #: rhodecode/templates/changelog/changelog.html:113 #: rhodecode/templates/changeset/changeset.html:88 @@ -3112,7 +3029,7 @@ msgstr "分支" #: rhodecode/templates/changelog/changelog.html:122 msgid "bookmark" -msgstr "" +msgstr "书签" #: rhodecode/templates/changelog/changelog.html:128 #: rhodecode/templates/changeset/changeset.html:96 @@ -3121,7 +3038,7 @@ msgstr "标签" #: rhodecode/templates/changelog/changelog.html:164 msgid "Show selected changes __S -> __E" -msgstr "" +msgstr "显示选定的修订集 __S -> __E" #: rhodecode/templates/changelog/changelog.html:255 msgid "There are no changes yet" @@ -3150,16 +3067,16 @@ msgstr "添加" #: rhodecode/templates/changeset/changeset.html:72 #, python-format msgid "affected %s files" -msgstr "" +msgstr "影响 %s 文件" #: rhodecode/templates/changeset/changeset.html:6 -#, fuzzy, python-format +#, python-format msgid "%s Changeset" -msgstr "无变更" +msgstr "%s 修订集" #: rhodecode/templates/changeset/changeset.html:14 msgid "Changeset" -msgstr "" +msgstr "修订集" #: rhodecode/templates/changeset/changeset.html:43 #: rhodecode/templates/changeset/diff_block.html:20 @@ -3173,87 +3090,85 @@ msgstr "下载 diff" #: rhodecode/templates/changeset/changeset.html:48 #: rhodecode/templates/changeset/changeset_file_comment.html:82 -#, fuzzy, python-format +#, python-format msgid "%d comment" msgid_plural "%d comments" -msgstr[0] "提交" +msgstr[0] "%d 条评论" #: rhodecode/templates/changeset/changeset.html:48 #: rhodecode/templates/changeset/changeset_file_comment.html:82 #, python-format msgid "(%d inline)" msgid_plural "(%d inline)" -msgstr[0] "" +msgstr[0] "(%d 内嵌)" #: rhodecode/templates/changeset/changeset.html:103 #, python-format msgid "%s files affected with %s insertions and %s deletions:" -msgstr "" +msgstr "%s 个文件受影响包括 %s 行插入和 %s 行删除:" #: rhodecode/templates/changeset/changeset.html:119 msgid "Changeset was too big and was cut off..." -msgstr "" +msgstr "修订集太大已被截断......" #: rhodecode/templates/changeset/changeset_file_comment.html:42 msgid "Submitting..." -msgstr "" +msgstr "提交中……" #: rhodecode/templates/changeset/changeset_file_comment.html:45 msgid "Commenting on line {1}." -msgstr "" +msgstr "在 {1} 行上评论" #: rhodecode/templates/changeset/changeset_file_comment.html:46 #: rhodecode/templates/changeset/changeset_file_comment.html:121 #, python-format msgid "Comments parsed using %s syntax with %s support." -msgstr "" +msgstr "评论使用 %s 语法并支持 %s" #: rhodecode/templates/changeset/changeset_file_comment.html:48 #: rhodecode/templates/changeset/changeset_file_comment.html:123 -msgid "Use @username inside this text to send notification to this RhodeCode user" -msgstr "" +msgid "" +"Use @username inside this text to send notification to this RhodeCode user" +msgstr "在文本中使用 @用户名 以发送通知到该 RhodeCode 用户" #: rhodecode/templates/changeset/changeset_file_comment.html:59 #: rhodecode/templates/changeset/changeset_file_comment.html:138 -#, fuzzy msgid "Comment" -msgstr "提交" +msgstr "评论" #: rhodecode/templates/changeset/changeset_file_comment.html:60 #: rhodecode/templates/changeset/changeset_file_comment.html:71 msgid "Hide" -msgstr "" +msgstr "影藏" #: rhodecode/templates/changeset/changeset_file_comment.html:67 -#, fuzzy msgid "You need to be logged in to comment." -msgstr "必须登录才能访问该页面" +msgstr "必须登录才能评论" #: rhodecode/templates/changeset/changeset_file_comment.html:67 msgid "Login now" -msgstr "" +msgstr "现在登陆" #: rhodecode/templates/changeset/changeset_file_comment.html:118 msgid "Leave a comment" -msgstr "" +msgstr "发表评论" #: rhodecode/templates/changeset/changeset_file_comment.html:124 msgid "Check this to change current status of code-review for this changeset" -msgstr "" +msgstr "勾选以改变这个修订集的代码审查状态" #: rhodecode/templates/changeset/changeset_file_comment.html:124 -#, fuzzy msgid "change status" -msgstr "变更集" +msgstr "改变状态" #: rhodecode/templates/changeset/changeset_file_comment.html:140 msgid "Comment and close" -msgstr "" +msgstr "评论并关闭" #: rhodecode/templates/changeset/changeset_range.html:5 -#, fuzzy, python-format +#, python-format msgid "%s Changesets" -msgstr "变更集" +msgstr "%s 修订集" #: rhodecode/templates/changeset/changeset_range.html:29 #: rhodecode/templates/compare/compare_diff.html:29 @@ -3264,26 +3179,23 @@ msgstr "比较显示" #: rhodecode/templates/compare/compare_diff.html:41 #: rhodecode/templates/pullrequests/pullrequest_show.html:69 msgid "Files affected" -msgstr "" +msgstr "影响文件" #: rhodecode/templates/changeset/diff_block.html:19 msgid "diff" -msgstr "" +msgstr "差别" #: rhodecode/templates/changeset/diff_block.html:27 -#, fuzzy msgid "show inline comments" -msgstr "文件内容" +msgstr "显示内嵌评论" #: rhodecode/templates/compare/compare_cs.html:5 -#, fuzzy msgid "No changesets" -msgstr "尚无修订" +msgstr "无修订" #: rhodecode/templates/compare/compare_diff.html:37 -#, fuzzy msgid "Outgoing changesets" -msgstr "尚无修订" +msgstr "传出修订集" #: rhodecode/templates/data_table/_dt_elements.html:39 #: rhodecode/templates/data_table/_dt_elements.html:41 @@ -3313,40 +3225,40 @@ msgstr "公共版本库" #: rhodecode/templates/summary/summary.html:87 #: rhodecode/templates/summary/summary.html:88 msgid "Fork of" -msgstr "" +msgstr "分支自" #: rhodecode/templates/data_table/_dt_elements.html:92 msgid "No changesets yet" -msgstr "尚无修订" +msgstr "无修订" #: rhodecode/templates/data_table/_dt_elements.html:104 -#, fuzzy, python-format +#, python-format msgid "Confirm to delete this user: %s" -msgstr "确认删除该用户" +msgstr "确认删除用户: %s" #: rhodecode/templates/email_templates/main.html:8 msgid "This is an notification from RhodeCode." -msgstr "" +msgstr "这是 RhodeCode 发送的一个通知。" #: rhodecode/templates/errors/error_document.html:46 #, python-format msgid "You will be redirected to %s in %s seconds" -msgstr "" +msgstr "%1s 秒后你将重定向到 %2s" #: rhodecode/templates/files/file_diff.html:4 -#, fuzzy, python-format +#, python-format msgid "%s File diff" -msgstr "文件 diff" +msgstr "%s 文件差异" #: rhodecode/templates/files/file_diff.html:12 msgid "File diff" -msgstr "文件 diff" +msgstr "文件差异" #: rhodecode/templates/files/files.html:4 #: rhodecode/templates/files/files.html:72 -#, fuzzy, python-format +#, python-format msgid "%s files" -msgstr "文件" +msgstr "%s 文件" #: rhodecode/templates/files/files.html:12 #: rhodecode/templates/summary/summary.html:340 @@ -3355,41 +3267,35 @@ msgstr "文件" #: rhodecode/templates/files/files_add.html:4 #: rhodecode/templates/files/files_edit.html:4 -#, fuzzy, python-format +#, python-format msgid "%s Edit file" -msgstr "编辑文件" +msgstr "%s 编辑文件" #: rhodecode/templates/files/files_add.html:19 -#, fuzzy msgid "add file" -msgstr "编辑文件" +msgstr "新建文件" #: rhodecode/templates/files/files_add.html:40 -#, fuzzy msgid "Add new file" -msgstr "添加新用户" +msgstr "新建文件" #: rhodecode/templates/files/files_add.html:45 -#, fuzzy msgid "File Name" msgstr "文件名" #: rhodecode/templates/files/files_add.html:49 #: rhodecode/templates/files/files_add.html:58 -#, fuzzy msgid "or" -msgstr "时" +msgstr "或者" #: rhodecode/templates/files/files_add.html:49 #: rhodecode/templates/files/files_add.html:54 -#, fuzzy msgid "Upload file" -msgstr "编辑文件" +msgstr "上传文件" #: rhodecode/templates/files/files_add.html:58 -#, fuzzy msgid "Create new file" -msgstr "创建用户 %s" +msgstr "创建新文件" #: rhodecode/templates/files/files_add.html:63 #: rhodecode/templates/files/files_edit.html:39 @@ -3399,7 +3305,7 @@ msgstr "位置" #: rhodecode/templates/files/files_add.html:67 msgid "use / to separate directories" -msgstr "" +msgstr "使用 / 目录分隔符" #: rhodecode/templates/files/files_add.html:77 #: rhodecode/templates/files/files_edit.html:63 @@ -3426,7 +3332,7 @@ msgstr "下一个修订" #: rhodecode/templates/files/files_browser.html:23 msgid "follow current branch" -msgstr "" +msgstr "沿着当前分支" #: rhodecode/templates/files/files_browser.html:27 msgid "search file list" @@ -3434,9 +3340,8 @@ msgstr "搜索文件列表" #: rhodecode/templates/files/files_browser.html:31 #: rhodecode/templates/shortlog/shortlog_data.html:65 -#, fuzzy msgid "add new file" -msgstr "添加新用户" +msgstr "新建文件" #: rhodecode/templates/files/files_browser.html:35 msgid "Loading file list..." @@ -3448,20 +3353,19 @@ msgstr "大小" #: rhodecode/templates/files/files_browser.html:49 msgid "Mimetype" -msgstr "" +msgstr "MIME 类型" #: rhodecode/templates/files/files_browser.html:50 -#, fuzzy msgid "Last Revision" -msgstr "下一个修订" +msgstr "最后修订号" #: rhodecode/templates/files/files_browser.html:51 msgid "Last modified" -msgstr "最后修改" +msgstr "最后修改于" #: rhodecode/templates/files/files_browser.html:52 msgid "Last commiter" -msgstr "最后提交" +msgstr "最后提交者" #: rhodecode/templates/files/files_edit.html:19 msgid "edit file" @@ -3484,12 +3388,10 @@ msgid "download as raw" msgstr "下载原始文件" #: rhodecode/templates/files/files_edit.html:54 -#, fuzzy msgid "source" -msgstr "显示代码" +msgstr "显示源文件" #: rhodecode/templates/files/files_edit.html:59 -#, fuzzy msgid "Editing file" msgstr "编辑文件" @@ -3498,20 +3400,18 @@ msgid "History" msgstr "历史" #: rhodecode/templates/files/files_source.html:9 -#, fuzzy msgid "diff to revision" -msgstr "下一个修订" +msgstr "比较差异" #: rhodecode/templates/files/files_source.html:10 -#, fuzzy msgid "show at revision" -msgstr "下一个修订" +msgstr "显示修订" #: rhodecode/templates/files/files_source.html:14 -#, fuzzy, python-format +#, python-format msgid "%s author" msgid_plural "%s authors" -msgstr[0] "作者" +msgstr[0] "%s 个作者" #: rhodecode/templates/files/files_source.html:36 msgid "show source" @@ -3528,39 +3428,37 @@ msgstr "文件过大,不能显示" #: rhodecode/templates/files/files_source.html:124 msgid "Selection link" -msgstr "" +msgstr "选择链接" #: rhodecode/templates/files/files_ypjax.html:5 -#, fuzzy msgid "annotation" msgstr "显示注释" #: rhodecode/templates/files/files_ypjax.html:15 msgid "Go back" -msgstr "" +msgstr "返回" #: rhodecode/templates/files/files_ypjax.html:16 msgid "No files at given path" -msgstr "" +msgstr "指定的路径中没有文件" #: rhodecode/templates/followers/followers.html:5 -#, fuzzy, python-format +#, python-format msgid "%s Followers" -msgstr "跟随者" +msgstr "%s 个关注者" #: rhodecode/templates/followers/followers.html:13 msgid "followers" -msgstr "跟随者" +msgstr "关注者" #: rhodecode/templates/followers/followers_data.html:12 -#, fuzzy msgid "Started following -" -msgstr "开始跟随" +msgstr "开始关注 - " #: rhodecode/templates/forks/fork.html:5 -#, fuzzy, python-format +#, python-format msgid "%s Fork" -msgstr "分支" +msgstr "%s 的分支" #: rhodecode/templates/forks/fork.html:31 msgid "Fork name" @@ -3571,30 +3469,29 @@ msgid "Private" msgstr "私有" #: rhodecode/templates/forks/fork.html:77 -#, fuzzy msgid "Copy permissions" -msgstr "权限" +msgstr "拷贝权限" #: rhodecode/templates/forks/fork.html:81 msgid "Copy permissions from forked repository" -msgstr "" +msgstr "从被分支版本库拷贝权限" #: rhodecode/templates/forks/fork.html:86 msgid "Update after clone" -msgstr "" +msgstr "克隆后更新" #: rhodecode/templates/forks/fork.html:90 msgid "Checkout source after making a clone" -msgstr "" +msgstr "完成克隆后检出源代码" #: rhodecode/templates/forks/fork.html:94 msgid "fork this repository" msgstr "对该版本库建立分支" #: rhodecode/templates/forks/forks.html:5 -#, fuzzy, python-format +#, python-format msgid "%s Forks" -msgstr "分支" +msgstr "%s 的分支" #: rhodecode/templates/forks/forks.html:13 msgid "forks" @@ -3606,47 +3503,42 @@ msgstr "已有分支" #: rhodecode/templates/forks/forks_data.html:38 msgid "There are no forks yet" -msgstr "尚未有任何分支" +msgstr "无分支" #: rhodecode/templates/journal/journal.html:13 -#, fuzzy msgid "ATOM journal feed" -msgstr "公共日志 %s %s 订阅" +msgstr "订阅日志 ATOM" #: rhodecode/templates/journal/journal.html:14 -#, fuzzy msgid "RSS journal feed" -msgstr "公共日志 %s %s 订阅" +msgstr "订阅日志 RSS" #: rhodecode/templates/journal/journal.html:24 #: rhodecode/templates/pullrequests/pullrequest.html:27 msgid "Refresh" -msgstr "" +msgstr "刷新" #: rhodecode/templates/journal/journal.html:27 #: rhodecode/templates/journal/public_journal.html:24 -#, fuzzy msgid "RSS feed" -msgstr "%s %s 订阅" +msgstr "订阅 RSS" #: rhodecode/templates/journal/journal.html:30 #: rhodecode/templates/journal/public_journal.html:27 msgid "ATOM feed" -msgstr "" +msgstr "订阅 ATOM" #: rhodecode/templates/journal/journal.html:41 -#, fuzzy msgid "Watched" -msgstr "缓存" +msgstr "关注的" #: rhodecode/templates/journal/journal.html:46 -#, fuzzy msgid "ADD" -msgstr "新增" +msgstr "新建版本库" #: rhodecode/templates/journal/journal.html:114 msgid "following user" -msgstr "跟随中用户" +msgstr "关注用户" #: rhodecode/templates/journal/journal.html:114 msgid "user" @@ -3654,21 +3546,19 @@ msgstr "用户" #: rhodecode/templates/journal/journal.html:147 msgid "You are not following any users or repositories" -msgstr "尚未跟随任何用户或版本库" +msgstr "未关注任何用户或版本库" #: rhodecode/templates/journal/journal_data.html:47 msgid "No entries yet" -msgstr "" +msgstr "没有条目" #: rhodecode/templates/journal/public_journal.html:13 -#, fuzzy msgid "ATOM public journal feed" -msgstr "公共日志 %s %s 订阅" +msgstr "订阅公共日志 ATOM" #: rhodecode/templates/journal/public_journal.html:14 -#, fuzzy msgid "RSS public journal feed" -msgstr "公共日志 %s %s 订阅" +msgstr "订阅公共日志 RSS" #: rhodecode/templates/journal/public_journal.html:21 msgid "Public Journal" @@ -3677,127 +3567,117 @@ msgstr "公共日志" #: rhodecode/templates/pullrequests/pullrequest.html:4 #: rhodecode/templates/pullrequests/pullrequest.html:12 msgid "New pull request" -msgstr "" +msgstr "新建拉取请求" #: rhodecode/templates/pullrequests/pullrequest.html:28 msgid "refresh overview" -msgstr "" +msgstr "刷新概览" #: rhodecode/templates/pullrequests/pullrequest.html:66 -#, fuzzy msgid "Detailed compare view" -msgstr "比较显示" +msgstr "详细比较显示" #: rhodecode/templates/pullrequests/pullrequest.html:70 #: rhodecode/templates/pullrequests/pullrequest_show.html:82 msgid "Pull request reviewers" -msgstr "" +msgstr "拉取请求检视人员" #: rhodecode/templates/pullrequests/pullrequest.html:79 #: rhodecode/templates/pullrequests/pullrequest_show.html:94 -#, fuzzy msgid "owner" msgstr "所有者" #: rhodecode/templates/pullrequests/pullrequest.html:91 #: rhodecode/templates/pullrequests/pullrequest_show.html:109 msgid "Add reviewer to this pull request." -msgstr "" +msgstr "为这个拉取请求增加检视人员" #: rhodecode/templates/pullrequests/pullrequest.html:97 -#, fuzzy msgid "Create new pull request" -msgstr "创建用户 %s" +msgstr "创建新的拉取请求" #: rhodecode/templates/pullrequests/pullrequest.html:106 #: rhodecode/templates/pullrequests/pullrequest_show.html:25 #: rhodecode/templates/pullrequests/pullrequest_show_all.html:33 -#, fuzzy msgid "Title" -msgstr "写" +msgstr "标题" #: rhodecode/templates/pullrequests/pullrequest.html:115 -#, fuzzy msgid "description" msgstr "描述" #: rhodecode/templates/pullrequests/pullrequest.html:123 msgid "Send pull request" -msgstr "" +msgstr "发送拉取请求" #: rhodecode/templates/pullrequests/pullrequest_show.html:23 #, python-format msgid "Closed %s" -msgstr "" +msgstr "关闭于 %s" #: rhodecode/templates/pullrequests/pullrequest_show.html:31 -#, fuzzy msgid "Status" -msgstr "变更集" +msgstr "状态" #: rhodecode/templates/pullrequests/pullrequest_show.html:36 msgid "Pull request status" -msgstr "" +msgstr "拉取请求状态" #: rhodecode/templates/pullrequests/pullrequest_show.html:44 msgid "Still not reviewed by" -msgstr "" +msgstr "还未检视的检视人员" #: rhodecode/templates/pullrequests/pullrequest_show.html:47 #, python-format msgid "%d reviewer" msgid_plural "%d reviewers" -msgstr[0] "" +msgstr[0] "%d 个检视者" #: rhodecode/templates/pullrequests/pullrequest_show.html:54 -#, fuzzy msgid "Created on" -msgstr "创建用户 %s" +msgstr "创建于 %s" #: rhodecode/templates/pullrequests/pullrequest_show.html:61 -#, fuzzy msgid "Compare view" msgstr "比较显示" #: rhodecode/templates/pullrequests/pullrequest_show.html:65 -#, fuzzy msgid "Incoming changesets" -msgstr "尚无修订" +msgstr "传入修订集" #: rhodecode/templates/pullrequests/pullrequest_show_all.html:4 -#, fuzzy msgid "all pull requests" -msgstr "创建用户 %s" +msgstr "所有拉取请求" #: rhodecode/templates/pullrequests/pullrequest_show_all.html:12 msgid "All pull requests" -msgstr "" +msgstr "所有拉取请求" #: rhodecode/templates/pullrequests/pullrequest_show_all.html:27 msgid "Closed" -msgstr "" - +msgstr "已关闭" + +# 中文中 repo name 在前面 serch term在后面 #: rhodecode/templates/search/search.html:6 -#, fuzzy, python-format +#, python-format msgid "Search \"%s\" in repository: %s" -msgstr "在版本库:" +msgstr "在版本库 %2s 中搜索 \"%1s\"" #: rhodecode/templates/search/search.html:8 -#, fuzzy, python-format +#, python-format msgid "Search \"%s\" in all repositories" -msgstr "在所有的版本库" +msgstr "在所有的版本库中搜索 \"%s\"" #: rhodecode/templates/search/search.html:12 #: rhodecode/templates/search/search.html:32 -#, fuzzy, python-format +#, python-format msgid "Search in repository: %s" -msgstr "在版本库:" +msgstr "在版本库 %s 中搜索" #: rhodecode/templates/search/search.html:14 #: rhodecode/templates/search/search.html:34 -#, fuzzy msgid "Search in all repositories" -msgstr "在所有的版本库" +msgstr "在所有的版本库中搜索" #: rhodecode/templates/search/search.html:48 msgid "Search term" @@ -3812,7 +3692,6 @@ msgid "File contents" msgstr "文件内容" #: rhodecode/templates/search/search.html:64 -#, fuzzy msgid "Commit messages" msgstr "提交信息" @@ -3827,14 +3706,14 @@ msgid "Permission denied" msgstr "权限不足" #: rhodecode/templates/settings/repo_settings.html:5 -#, fuzzy, python-format +#, python-format msgid "%s Settings" -msgstr "设置" +msgstr "%s 设置" #: rhodecode/templates/shortlog/shortlog.html:5 -#, fuzzy, python-format +#, python-format msgid "%s Shortlog" -msgstr "简短日志" +msgstr "%s 简短日志" #: rhodecode/templates/shortlog/shortlog.html:14 msgid "shortlog" @@ -3842,55 +3721,52 @@ msgstr "简短日志" #: rhodecode/templates/shortlog/shortlog_data.html:7 msgid "age" -msgstr "" +msgstr "时间" #: rhodecode/templates/shortlog/shortlog_data.html:18 -#, fuzzy msgid "No commit message" -msgstr "提交信息" +msgstr "没有提交信息" #: rhodecode/templates/shortlog/shortlog_data.html:62 msgid "Add or upload files directly via RhodeCode" -msgstr "" +msgstr "通过 RhodeCode 直接添加或者上传文件" #: rhodecode/templates/shortlog/shortlog_data.html:71 msgid "Push new repo" -msgstr "" +msgstr "Push 新版本库" #: rhodecode/templates/shortlog/shortlog_data.html:79 -#, fuzzy msgid "Existing repository?" -msgstr "Git 版本库" +msgstr "现有版本库?" #: rhodecode/templates/summary/summary.html:4 -#, fuzzy, python-format +#, python-format msgid "%s Summary" -msgstr "概要" +msgstr "%s 概要" #: rhodecode/templates/summary/summary.html:12 msgid "summary" msgstr "概要" #: rhodecode/templates/summary/summary.html:20 -#, fuzzy, python-format +#, python-format msgid "repo %s ATOM feed" -msgstr "订阅 atom %s" +msgstr "订阅 ATOM %s" #: rhodecode/templates/summary/summary.html:21 -#, fuzzy, python-format +#, python-format msgid "repo %s RSS feed" -msgstr "订阅 rss %s" +msgstr "订阅 RSS %s" #: rhodecode/templates/summary/summary.html:49 #: rhodecode/templates/summary/summary.html:52 -#, fuzzy msgid "ATOM" -msgstr "作者" +msgstr "ATOM" #: rhodecode/templates/summary/summary.html:82 -#, fuzzy, python-format +#, python-format msgid "Non changable ID %s" -msgstr "无变更" +msgstr "不可变 ID %s" #: rhodecode/templates/summary/summary.html:87 msgid "public" @@ -3898,7 +3774,7 @@ msgstr "公共" #: rhodecode/templates/summary/summary.html:95 msgid "remote clone" -msgstr "远程 clone" +msgstr "远程克隆" #: rhodecode/templates/summary/summary.html:116 msgid "Contact" @@ -3906,20 +3782,19 @@ msgstr "联系方式" #: rhodecode/templates/summary/summary.html:130 msgid "Clone url" -msgstr "clone 地址" +msgstr "克隆地址" #: rhodecode/templates/summary/summary.html:133 msgid "Show by Name" -msgstr "" +msgstr "以名字显示" #: rhodecode/templates/summary/summary.html:134 msgid "Show by ID" -msgstr "" +msgstr "以 ID 显示" #: rhodecode/templates/summary/summary.html:142 -#, fuzzy msgid "Trending files" -msgstr "编辑文件" +msgstr "文件趋势图" #: rhodecode/templates/summary/summary.html:150 #: rhodecode/templates/summary/summary.html:166 @@ -3933,50 +3808,48 @@ msgstr "下载" #: rhodecode/templates/summary/summary.html:162 msgid "There are no downloads yet" -msgstr "尚无任何下载" +msgstr "无下载" #: rhodecode/templates/summary/summary.html:164 msgid "Downloads are disabled for this repository" msgstr "这个版本库的下载已经禁用" #: rhodecode/templates/summary/summary.html:170 -#, fuzzy msgid "Download as zip" -msgstr "下载原始文件" +msgstr "下载 zip 包" #: rhodecode/templates/summary/summary.html:173 msgid "Check this to download archive with subrepos" -msgstr "" +msgstr "勾选以下载包含子版本库的压缩包" #: rhodecode/templates/summary/summary.html:173 msgid "with subrepos" -msgstr "" +msgstr "包括子版本库" #: rhodecode/templates/summary/summary.html:186 msgid "Commit activity by day / author" -msgstr "" +msgstr "按日期或作者的提交活动" #: rhodecode/templates/summary/summary.html:197 msgid "Stats gathered: " -msgstr "" +msgstr "已收集的统计: " #: rhodecode/templates/summary/summary.html:218 msgid "Shortlog" msgstr "简短日志" #: rhodecode/templates/summary/summary.html:220 -#, fuzzy msgid "Quick start" -msgstr "快速过滤..." +msgstr "快速入门" #: rhodecode/templates/summary/summary.html:233 #, python-format msgid "Readme file at revision '%s'" -msgstr "" +msgstr "修订 '%s' 中的README" #: rhodecode/templates/summary/summary.html:236 msgid "Permalink to this readme" -msgstr "" +msgstr "这个 README 的固定链接" #: rhodecode/templates/summary/summary.html:293 #, python-format @@ -4016,7 +3889,6 @@ msgid "file removed" msgstr "文件已删除" #: rhodecode/templates/tags/tags.html:5 -#, fuzzy, python-format +#, python-format msgid "%s Tags" -msgstr "之前" - +msgstr "%s 标签" diff --git a/rhodecode/lib/diffs.py b/rhodecode/lib/diffs.py --- a/rhodecode/lib/diffs.py +++ b/rhodecode/lib/diffs.py @@ -44,6 +44,7 @@ from rhodecode.lib.vcs.nodes import File from rhodecode.lib.vcs.backends.base import EmptyChangeset from rhodecode.lib.helpers import escape from rhodecode.lib.utils import make_ui +from rhodecode.lib.utils2 import safe_unicode def wrap_to_table(str_): @@ -214,7 +215,7 @@ class DiffProcessor(object): self.adds += 1 elif l.startswith('-') and not l.startswith('---'): self.removes += 1 - return l.decode('utf8', 'replace') + return safe_unicode(l) output = list(diffiterator) size = len(output) diff --git a/rhodecode/lib/helpers.py b/rhodecode/lib/helpers.py --- a/rhodecode/lib/helpers.py +++ b/rhodecode/lib/helpers.py @@ -10,6 +10,7 @@ import urllib import math import logging import re +import urlparse from datetime import datetime from pygments.formatters.html import HtmlFormatter @@ -711,11 +712,15 @@ HasRepoPermissionAny, HasRepoPermissionA #============================================================================== def gravatar_url(email_address, size=30): + from pylons import url ## doh, we need to re-import url to mock it later if(str2bool(config['app_conf'].get('use_gravatar')) and config['app_conf'].get('alternative_gravatar_url')): tmpl = config['app_conf'].get('alternative_gravatar_url', '') + parsed_url = urlparse.urlparse(url.current(qualified=True)) tmpl = tmpl.replace('{email}', email_address)\ - .replace('{md5email}', hashlib.md5(email_address.lower()).hexdigest())\ + .replace('{md5email}', hashlib.md5(email_address.lower()).hexdigest()) \ + .replace('{netloc}', parsed_url.netloc)\ + .replace('{scheme}', parsed_url.scheme)\ .replace('{size}', str(size)) return tmpl diff --git a/rhodecode/lib/indexers/daemon.py b/rhodecode/lib/indexers/daemon.py --- a/rhodecode/lib/indexers/daemon.py +++ b/rhodecode/lib/indexers/daemon.py @@ -77,6 +77,8 @@ class WhooshIndexingDaemon(object): #filter repo list if repo_list: + #Fix non-ascii repo names to unicode + repo_list = map(safe_unicode, repo_list) self.filtered_repo_paths = {} for repo_name, repo in self.repo_paths.items(): if repo_name in repo_list: @@ -238,6 +240,7 @@ class WhooshIndexingDaemon(object): writer_is_dirty = False try: indexed_total = 0 + repo_name = None for repo_name, repo in self.repo_paths.items(): # skip indexing if there aren't any revs in the repo num_of_revs = len(repo) @@ -279,10 +282,10 @@ class WhooshIndexingDaemon(object): if writer_is_dirty: log.debug('>> COMMITING CHANGES TO CHANGESET INDEX<<') writer.commit(merge=True) - log.debug('>> COMMITTED CHANGES TO CHANGESET INDEX<<') + log.debug('>>> FINISHED REBUILDING CHANGESET INDEX <<<') else: writer.cancel - log.debug('>> NOTHING TO COMMIT<<') + log.debug('>> NOTHING TO COMMIT TO CHANGESET INDEX<<') def update_file_index(self): log.debug((u'STARTING INCREMENTAL INDEXING UPDATE FOR EXTENSIONS %s ' @@ -364,11 +367,11 @@ class WhooshIndexingDaemon(object): ) finally: if writer_is_dirty: - log.debug('>> COMMITING CHANGES <<') + log.debug('>> COMMITING CHANGES TO FILE INDEX <<') writer.commit(merge=True) - log.debug('>>> FINISHED REBUILDING INDEX <<<') + log.debug('>>> FINISHED REBUILDING FILE INDEX <<<') else: - log.debug('>> NOTHING TO COMMIT<<') + log.debug('>> NOTHING TO COMMIT TO FILE INDEX <<') writer.cancel() def build_indexes(self): diff --git a/rhodecode/lib/utils2.py b/rhodecode/lib/utils2.py --- a/rhodecode/lib/utils2.py +++ b/rhodecode/lib/utils2.py @@ -147,6 +147,23 @@ def generate_api_key(username, salt=None return hashlib.sha1(username + salt).hexdigest() +def safe_int(val, default=None): + """ + Returns int() of val if val is not convertable to int use default + instead + + :param val: + :param default: + """ + + try: + val = int(val) + except ValueError: + val = default + + return val + + def safe_unicode(str_, from_encoding=None): """ safe unicode function. Does few trick to turn str_ into unicode diff --git a/rhodecode/lib/vcs/utils/diffs.py b/rhodecode/lib/vcs/utils/diffs.py --- a/rhodecode/lib/vcs/utils/diffs.py +++ b/rhodecode/lib/vcs/utils/diffs.py @@ -13,6 +13,7 @@ from mercurial.match import match from rhodecode.lib.vcs.exceptions import VCSError from rhodecode.lib.vcs.nodes import FileNode, NodeError +from rhodecode.lib.vcs.utils import safe_unicode def get_udiff(filenode_old, filenode_new, show_whitespace=True): @@ -149,7 +150,7 @@ class DiffProcessor(object): self.adds += 1 elif l.startswith('-') and not l.startswith('---'): self.removes += 1 - return l.decode('utf8', 'replace') + return safe_unicode(l) output = list(diffiterator) size = len(output) diff --git a/rhodecode/model/db.py b/rhodecode/model/db.py --- a/rhodecode/model/db.py +++ b/rhodecode/model/db.py @@ -1027,14 +1027,20 @@ class RepoGroup(Base, BaseModel): self.group_name) @classmethod - def groups_choices(cls): + def groups_choices(cls, check_perms=False): from webhelpers.html import literal as _literal + from rhodecode.model.scm import ScmModel + groups = cls.query().all() + if check_perms: + #filter group user have access to, it's done + #magically inside ScmModel based on current user + groups = ScmModel().get_repos_groups(groups) repo_groups = [('', '')] sep = ' » ' _name = lambda k: _literal(sep.join(k)) repo_groups.extend([(x.group_id, _name(x.full_path_splitted)) - for x in cls.query().all()]) + for x in groups]) repo_groups = sorted(repo_groups, key=lambda t: t[1].split(sep)[0]) return repo_groups diff --git a/rhodecode/model/forms.py b/rhodecode/model/forms.py --- a/rhodecode/model/forms.py +++ b/rhodecode/model/forms.py @@ -177,7 +177,8 @@ def RepoForm(edit=False, old_data={}, su repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True), v.SlugifyName()) clone_uri = All(v.UnicodeString(strip=True, min=1, not_empty=False)) - repo_group = v.OneOf(repo_groups, hideList=True) + repo_group = All(v.CanWriteGroup(), + v.OneOf(repo_groups, hideList=True)) repo_type = v.OneOf(supported_backends) description = v.UnicodeString(strip=True, min=1, not_empty=False) private = v.StringBoolean(if_missing=False) @@ -203,7 +204,8 @@ def RepoForkForm(edit=False, old_data={} filter_extra_fields = False repo_name = All(v.UnicodeString(strip=True, min=1, not_empty=True), v.SlugifyName()) - repo_group = v.OneOf(repo_groups, hideList=True) + repo_group = All(v.CanWriteGroup(), + v.OneOf(repo_groups, hideList=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) diff --git a/rhodecode/model/validators.py b/rhodecode/model/validators.py --- a/rhodecode/model/validators.py +++ b/rhodecode/model/validators.py @@ -19,6 +19,7 @@ from rhodecode.model.db import RepoGroup ChangesetStatus from rhodecode.lib.exceptions import LdapImportError from rhodecode.config.routing import ADMIN_PREFIX +from rhodecode.lib.auth import HasReposGroupPermissionAny # silence warnings and pylint UnicodeString, OneOf, Int, Number, Regex, Email, Bool, StringBoolean, Set, \ @@ -466,6 +467,25 @@ def ValidForkType(old_data={}): return _validator +def CanWriteGroup(): + class _validator(formencode.validators.FancyValidator): + messages = { + 'permission_denied': _(u"You don't have permissions " + "to create repository in this group") + } + + def validate_python(self, value, state): + gr = RepoGroup.get(value) + if not HasReposGroupPermissionAny( + 'group.write', 'group.admin' + )(gr.group_name, 'get group of repo form'): + msg = M(self, 'permission_denied', state) + raise formencode.Invalid(msg, value, state, + error_dict=dict(repo_type=msg) + ) + return _validator + + def ValidPerms(type_='repo'): if type_ == 'group': EMPTY_PERM = 'group.none' diff --git a/rhodecode/public/css/style.css b/rhodecode/public/css/style.css --- a/rhodecode/public/css/style.css +++ b/rhodecode/public/css/style.css @@ -658,6 +658,24 @@ div:hover > a.permalink { padding: 12px 9px 7px 24px; } +#header #header-inner #quick li ul li a.locking_add,#header #header-inner #quick li ul li a.locking_add:hover + { + background: #FFF url("../images/icons/lock_add.png") no-repeat 4px + 9px; + width: 167px; + margin: 0; + padding: 12px 9px 7px 24px; +} + +#header #header-inner #quick li ul li a.locking_del,#header #header-inner #quick li ul li a.locking_del:hover + { + background: #FFF url("../images/icons/lock_delete.png") no-repeat 4px + 9px; + width: 167px; + margin: 0; + padding: 12px 9px 7px 24px; +} + #header #header-inner #quick li ul li a.pull_request,#header #header-inner #quick li ul li a.pull_request:hover { background: #FFF url("../images/icons/arrow_join.png") no-repeat 4px diff --git a/rhodecode/public/js/rhodecode.js b/rhodecode/public/js/rhodecode.js --- a/rhodecode/public/js/rhodecode.js +++ b/rhodecode/public/js/rhodecode.js @@ -86,7 +86,18 @@ var prevElementSibling = function( el ) } } - +var setSelectValue = function(select, val){ + var selection = YUD.get(select); + + // select element + for(var i=0;i - ${h.checkbox('recursive',value="True", label=_('apply to parents'))} + ${h.checkbox('recursive',value="True", label=_('apply to children'))} ${_('Set or revoke permission to all children of that group, including repositories and other groups')} diff --git a/rhodecode/templates/base/base.html b/rhodecode/templates/base/base.html --- a/rhodecode/templates/base/base.html +++ b/rhodecode/templates/base/base.html @@ -201,17 +201,26 @@
    %if h.HasRepoPermissionAll('repository.admin')(c.repo_name): %if h.HasPermissionAll('hg.admin')('access settings on repository'): -
  • ${h.link_to(_('settings'),h.url('edit_repo',repo_name=c.repo_name),class_='settings')}
  • +
  • ${h.link_to(_('repository settings'),h.url('edit_repo',repo_name=c.repo_name),class_='settings')}
  • %else: -
  • ${h.link_to(_('settings'),h.url('repo_settings_home',repo_name=c.repo_name),class_='settings')}
  • +
  • ${h.link_to(_('repository settings'),h.url('repo_settings_home',repo_name=c.repo_name),class_='settings')}
  • %endif %endif +
  • ${h.link_to(_('fork'),h.url('repo_fork_home',repo_name=c.repo_name),class_='fork')}
  • %if h.is_hg(c.rhodecode_repo):
  • ${h.link_to(_('Open new pull request'),h.url('pullrequest_home',repo_name=c.repo_name),class_='pull_request')}
  • %endif
  • ${h.link_to(_('search'),h.url('search_repo',search_repo=c.repo_name),class_='search')}
  • + %if h.HasRepoPermissionAny('repository.write','repository.admin')(c.repo_name) and c.rhodecode_db_repo.enable_locking: + %if c.rhodecode_db_repo.locked[0]: +
  • ${h.link_to(_('unlock'), h.url('toggle_locking',repo_name=c.repo_name),class_='locking_del')}
  • + %else: +
  • ${h.link_to(_('lock'), h.url('toggle_locking',repo_name=c.repo_name),class_='locking_add')}
  • + %endif + %endif + % if h.HasPermissionAll('hg.admin')('access admin main page'):
  • ${h.link_to(_('admin'),h.url('admin_home'),class_='admin')} @@ -227,7 +236,7 @@
  • ${h.link_to(_('settings'),h.url('admin_settings'),class_='settings')}
- + ## ADMIN MENU ${admin_menu()} % endif diff --git a/rhodecode/templates/base/root.html b/rhodecode/templates/base/root.html --- a/rhodecode/templates/base/root.html +++ b/rhodecode/templates/base/root.html @@ -9,8 +9,8 @@ ## CSS ### <%def name="css()"> - - + + ## EXTRA FOR CSS ${self.css_extra()} @@ -50,13 +50,13 @@ }; var _TM = TRANSLATION_MAP; - + - - - + + + ## EXTRA FOR JS ${self.js_extra()} diff --git a/rhodecode/templates/pullrequests/pullrequest.html b/rhodecode/templates/pullrequests/pullrequest.html --- a/rhodecode/templates/pullrequests/pullrequest.html +++ b/rhodecode/templates/pullrequests/pullrequest.html @@ -53,7 +53,7 @@ gravatar - ${h.select('other_repo',c.default_pull_request ,c.other_repos,class_='refs')}:${h.select('other_ref','',c.default_revs,class_='refs')} + ${h.select('other_repo',c.default_pull_request ,c.other_repos,class_='refs')}:${h.select('other_ref',c.default_pull_request_rev,c.default_revs,class_='refs')}
@@ -135,6 +135,7 @@ PullRequestAutoComplete('user', 'reviewers_container', _USERS_AC_DATA, _GROUPS_AC_DATA); var other_repos_info = ${c.other_repos_info|n}; + var loadPreview = function(){ YUD.setStyle(YUD.get('pull_request_overview_url').parentElement,'display','none'); var url = "${h.url('compare_url', @@ -145,28 +146,38 @@ as_form=True)}"; var select_refs = YUQ('#pull_request_form select.refs') - + var rev_data = {}; // gather the org/other ref and repo here for(var i=0;i1){ key = select_ref.name+"_type"; val = select_ref_data[0]; url = url.replace(key,val); - + rev_data[key] = val; + key = select_ref.name; val = select_ref_data[1]; url = url.replace(key,val); - + rev_data[key] = val; + }else{ key = select_ref.name; val = select_ref.value; url = url.replace(key,val); + rev_data[key] = val; } } + YUE.on('other_repo', 'change', function(e){ + var repo_name = e.currentTarget.value; + // replace the