Commits

Marcin Kuzminski committed d998cc8 Merge

Merge branch beta into stable

Comments (0)

Files changed (40)

   - 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;'
     Takumi IINO <trot.thunder@gmail.com>
     Indra Talip <indra.talip@gmail.com>
     James Rhodes <jrhodes@redpointsoftware.com.au>
-    Dominik Ruf <dominikruf@gmail.com>
+    Dominik Ruf <dominikruf@gmail.com>
+    xpol <xpolife@gmail.com>
 ## {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}
 
 =========
 
 
+1.4.2 (**2012-09-12**)
+----------------------
+
+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**)
 ----------------------
 
-:status: in-progress
-:branch: beta
-
 news
 ++++
 

docs/installation_win.rst

 
 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
 ------------------------------------------
 
 ## {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}
 

rhodecode/__init__.py

 import sys
 import platform
 
-VERSION = (1, 4, 1)
+VERSION = (1, 4, 2)
 
 try:
     from rhodecode.lib import get_current_revision

rhodecode/config/deployment.ini_tmpl

 ## {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}
 

rhodecode/config/routing.py

         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",
                 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"]))

rhodecode/controllers/admin/admin.py

 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__)
 
                 .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')
 

rhodecode/controllers/admin/notifications.py

 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__)
         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,

rhodecode/controllers/admin/repos.py

         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()

rhodecode/controllers/admin/repos_groups.py

 
         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')

rhodecode/controllers/admin/settings.py

 
                 ## 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)
 
     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()
 

rhodecode/controllers/changelog.py

 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__)
 
             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:

rhodecode/controllers/compare.py

 
 from rhodecode.model.db import Repository
 from rhodecode.model.pull_request import PullRequestModel
+from webob.exc import HTTPBadRequest
 
 log = logging.getLogger(__name__)
 
     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
         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):
 
         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
         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]

rhodecode/controllers/followers.py

 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__)
 
         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)

rhodecode/controllers/forks.py

 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__)
 
         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
     @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):

rhodecode/controllers/journal.py

 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__)
 
     @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)\
     @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)\

rhodecode/controllers/pullrequests.py

 
         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
         # 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] = {
         #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))

rhodecode/controllers/search.py

 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__)
 
             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'],
 
                     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,

rhodecode/controllers/settings.py

 
 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
 
         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()
             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()
             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))
+

rhodecode/controllers/shortlog.py

 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__)
 
         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)

rhodecode/i18n/zh_CN/LC_MESSAGES/rhodecode.mo

Binary file modified.

rhodecode/i18n/zh_CN/LC_MESSAGES/rhodecode.po

 # This file is distributed under the same license as the RhodeCode project.
 # FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
 # mikespook <mikespook@gmail.com>, 2012.
+# xpol <xpolife@gmail.com>, 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 <mikespook@gmail.com>\n"
+"PO-Revision-Date: 2012-09-19 13:27+0800\n"
+"Last-Translator: xpol <xpolife@gmail.com>\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
 
 #: 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
 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
 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"
 #: 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
 #: 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
 #: 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 "公共日志"
 
 
 #: 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."
 #: 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
 #: 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
 
 #: 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"
 
 #: 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"
 
 #: 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"
 
 #: 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
 #: 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
 #: 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
 #: 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
 
 #: 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"
 #: 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"
 
 #: 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"
 #: 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
 #: 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"
 
 #: 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"
 
 #: 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
 #: 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
 #: 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"
 
 #: 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"
 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 "修订"
 
 #: 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"
 #: 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"
 #: 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] 新用户注册"
 
 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"
 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"
 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 "控制面板"