summaryrefslogtreecommitdiffstats
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/gitblit/models/RefModel.java7
-rw-r--r--src/main/java/com/gitblit/service/LuceneService.java2
-rw-r--r--src/main/java/com/gitblit/transport/ssh/DisabledFilesystemFactory.java35
-rw-r--r--src/main/java/com/gitblit/transport/ssh/FileKeyPairProvider.java154
-rw-r--r--src/main/java/com/gitblit/transport/ssh/NonForwardingFilter.java7
-rw-r--r--src/main/java/com/gitblit/transport/ssh/SshDaemon.java23
-rw-r--r--src/main/java/com/gitblit/transport/ssh/SshDaemonClient.java2
-rw-r--r--src/main/java/com/gitblit/transport/ssh/SshKey.java7
-rw-r--r--src/main/java/com/gitblit/transport/ssh/SshKeyAuthenticator.java2
-rw-r--r--src/main/java/com/gitblit/transport/ssh/SshServerSession.java4
-rw-r--r--src/main/java/com/gitblit/transport/ssh/SshServerSessionFactory.java2
-rw-r--r--src/main/java/com/gitblit/transport/ssh/UsernamePasswordAuthenticator.java4
-rw-r--r--src/main/java/com/gitblit/utils/JGitUtils.java7
-rw-r--r--src/main/java/com/gitblit/utils/MarkdownUtils.java3
-rw-r--r--src/main/java/com/gitblit/utils/MetricUtils.java2
-rw-r--r--src/main/java/com/gitblit/wicket/GitBlitWebApp_zh_TW.properties766
-rw-r--r--src/main/java/com/gitblit/wicket/pages/TicketPage.java4
-rw-r--r--src/main/java/com/gitblit/wicket/pages/UserPage.java3
-rw-r--r--src/main/java/com/gitblit/wicket/panels/HistoryPanel.java2
-rw-r--r--src/main/java/com/gitblit/wicket/panels/LogPanel.java2
-rw-r--r--src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java3
-rw-r--r--src/main/java/com/gitblit/wicket/panels/SearchPanel.java2
-rw-r--r--src/main/java/login_zh_TW.mkd3
-rw-r--r--src/main/java/welcome_zh_TW.mkd3
24 files changed, 984 insertions, 65 deletions
diff --git a/src/main/java/com/gitblit/models/RefModel.java b/src/main/java/com/gitblit/models/RefModel.java
index 02ba1302..d20c2dc6 100644
--- a/src/main/java/com/gitblit/models/RefModel.java
+++ b/src/main/java/com/gitblit/models/RefModel.java
@@ -58,12 +58,7 @@ public class RefModel implements Serializable, Comparable<RefModel> {
}
} else if (referencedObject instanceof RevCommit) {
RevCommit commit = (RevCommit) referencedObject;
- PersonIdent committer = commit.getCommitterIdent();
- if (committer != null) {
- date = committer.getWhen();
- } else {
- date = JGitUtils.getCommitDate(commit);
- }
+ date = JGitUtils.getAuthorDate(commit);
}
}
return date;
diff --git a/src/main/java/com/gitblit/service/LuceneService.java b/src/main/java/com/gitblit/service/LuceneService.java
index 285ea8d7..097a39b2 100644
--- a/src/main/java/com/gitblit/service/LuceneService.java
+++ b/src/main/java/com/gitblit/service/LuceneService.java
@@ -437,7 +437,7 @@ public class LuceneService implements Runnable {
// skip non-annotated tags
continue;
}
- if (!tags.containsKey(tag.getObjectId().getName())) {
+ if (!tags.containsKey(tag.getReferencedObjectId().getName())) {
tags.put(tag.getReferencedObjectId().getName(), new ArrayList<String>());
}
tags.get(tag.getReferencedObjectId().getName()).add(tag.displayName);
diff --git a/src/main/java/com/gitblit/transport/ssh/DisabledFilesystemFactory.java b/src/main/java/com/gitblit/transport/ssh/DisabledFilesystemFactory.java
index de661a4d..9bab3b8e 100644
--- a/src/main/java/com/gitblit/transport/ssh/DisabledFilesystemFactory.java
+++ b/src/main/java/com/gitblit/transport/ssh/DisabledFilesystemFactory.java
@@ -16,31 +16,22 @@
package com.gitblit.transport.ssh;
import java.io.IOException;
+import java.nio.file.FileSystem;
-import org.apache.sshd.common.Session;
import org.apache.sshd.common.file.FileSystemFactory;
-import org.apache.sshd.common.file.FileSystemView;
-import org.apache.sshd.common.file.SshFile;
+import org.apache.sshd.common.session.Session;
public class DisabledFilesystemFactory implements FileSystemFactory {
- @Override
- public FileSystemView createFileSystemView(Session session) throws IOException {
- return new FileSystemView() {
- @Override
- public SshFile getFile(SshFile baseDir, String file) {
- return null;
- }
-
- @Override
- public SshFile getFile(String file) {
- return null;
- }
-
- @Override
- public FileSystemView getNormalizedView() {
- return null;
- }
- };
- }
+ /**
+ * Create user specific file system.
+ *
+ * @param session The session created for the user
+ * @return The current {@link FileSystem} for the provided session
+ * @throws java.io.IOException when the filesystem can not be created
+ */
+ @Override
+ public FileSystem createFileSystem(Session session) throws IOException {
+ return null;
+ }
}
diff --git a/src/main/java/com/gitblit/transport/ssh/FileKeyPairProvider.java b/src/main/java/com/gitblit/transport/ssh/FileKeyPairProvider.java
new file mode 100644
index 00000000..db0741e0
--- /dev/null
+++ b/src/main/java/com/gitblit/transport/ssh/FileKeyPairProvider.java
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.gitblit.transport.ssh;
+
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.security.KeyPair;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+import org.apache.sshd.common.keyprovider.AbstractKeyPairProvider;
+import org.apache.sshd.common.util.SecurityUtils;
+import org.bouncycastle.openssl.PEMDecryptorProvider;
+import org.bouncycastle.openssl.PEMEncryptedKeyPair;
+import org.bouncycastle.openssl.PEMKeyPair;
+import org.bouncycastle.openssl.PEMParser;
+import org.bouncycastle.openssl.PasswordFinder;
+import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
+import org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder;
+
+/**
+ * This host key provider loads private keys from the specified files.
+ *
+ * Note that this class has a direct dependency on BouncyCastle and won't work
+ * unless it has been correctly registered as a security provider.
+ *
+ * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
+ */
+public class FileKeyPairProvider extends AbstractKeyPairProvider {
+
+ private String[] files;
+ private PasswordFinder passwordFinder;
+
+ public FileKeyPairProvider() {
+ }
+
+ public FileKeyPairProvider(String[] files) {
+ this.files = files;
+ }
+
+ public FileKeyPairProvider(String[] files, PasswordFinder passwordFinder) {
+ this.files = files;
+ this.passwordFinder = passwordFinder;
+ }
+
+ public String[] getFiles() {
+ return files;
+ }
+
+ public void setFiles(String[] files) {
+ this.files = files;
+ }
+
+ public PasswordFinder getPasswordFinder() {
+ return passwordFinder;
+ }
+
+ public void setPasswordFinder(PasswordFinder passwordFinder) {
+ this.passwordFinder = passwordFinder;
+ }
+
+ public Iterable<KeyPair> loadKeys() {
+ if (!SecurityUtils.isBouncyCastleRegistered()) {
+ throw new IllegalStateException("BouncyCastle must be registered as a JCE provider");
+ }
+ return new Iterable<KeyPair>() {
+ @Override
+ public Iterator<KeyPair> iterator() {
+ return new Iterator<KeyPair>() {
+ private final Iterator<String> iterator = Arrays.asList(files).iterator();
+ private KeyPair nextKeyPair;
+ private boolean nextKeyPairSet = false;
+ @Override
+ public boolean hasNext() {
+ return nextKeyPairSet || setNextObject();
+ }
+ @Override
+ public KeyPair next() {
+ if (!nextKeyPairSet) {
+ if (!setNextObject()) {
+ throw new NoSuchElementException();
+ }
+ }
+ nextKeyPairSet = false;
+ return nextKeyPair;
+ }
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ private boolean setNextObject() {
+ while (iterator.hasNext()) {
+ String file = iterator.next();
+ nextKeyPair = doLoadKey(file);
+ if (nextKeyPair != null) {
+ nextKeyPairSet = true;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ };
+ }
+ };
+ }
+
+ protected KeyPair doLoadKey(String file) {
+ try {
+ PEMParser r = new PEMParser(new InputStreamReader(new FileInputStream(file)));
+ try {
+ Object o = r.readObject();
+
+ JcaPEMKeyConverter pemConverter = new JcaPEMKeyConverter();
+ pemConverter.setProvider("BC");
+ if (passwordFinder != null && o instanceof PEMEncryptedKeyPair) {
+ JcePEMDecryptorProviderBuilder decryptorBuilder = new JcePEMDecryptorProviderBuilder();
+ PEMDecryptorProvider pemDecryptor = decryptorBuilder.build(passwordFinder.getPassword());
+ o = pemConverter.getKeyPair(((PEMEncryptedKeyPair) o).decryptKeyPair(pemDecryptor));
+ }
+
+ if (o instanceof PEMKeyPair) {
+ o = pemConverter.getKeyPair((PEMKeyPair)o);
+ return (KeyPair) o;
+ } else if (o instanceof KeyPair) {
+ return (KeyPair) o;
+ }
+ } finally {
+ r.close();
+ }
+ } catch (Exception e) {
+ log.warn("Unable to read key " + file, e);
+ }
+ return null;
+ }
+
+}
diff --git a/src/main/java/com/gitblit/transport/ssh/NonForwardingFilter.java b/src/main/java/com/gitblit/transport/ssh/NonForwardingFilter.java
index 4bd75d59..29f7750d 100644
--- a/src/main/java/com/gitblit/transport/ssh/NonForwardingFilter.java
+++ b/src/main/java/com/gitblit/transport/ssh/NonForwardingFilter.java
@@ -15,13 +15,14 @@
*/
package com.gitblit.transport.ssh;
-import org.apache.sshd.common.ForwardingFilter;
-import org.apache.sshd.common.Session;
import org.apache.sshd.common.SshdSocketAddress;
+import org.apache.sshd.common.session.Session;
+import org.apache.sshd.server.forward.ForwardingFilter;
public class NonForwardingFilter implements ForwardingFilter {
+
@Override
- public boolean canConnect(SshdSocketAddress address, Session session) {
+ public boolean canConnect(Type type, SshdSocketAddress address, Session session) {
return false;
}
diff --git a/src/main/java/com/gitblit/transport/ssh/SshDaemon.java b/src/main/java/com/gitblit/transport/ssh/SshDaemon.java
index 68a2e901..b6fae25e 100644
--- a/src/main/java/com/gitblit/transport/ssh/SshDaemon.java
+++ b/src/main/java/com/gitblit/transport/ssh/SshDaemon.java
@@ -28,20 +28,19 @@ import java.util.List;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicBoolean;
-import org.apache.sshd.SshServer;
import org.apache.sshd.common.NamedFactory;
import org.apache.sshd.common.io.IoServiceFactoryFactory;
import org.apache.sshd.common.io.mina.MinaServiceFactoryFactory;
import org.apache.sshd.common.io.nio2.Nio2ServiceFactoryFactory;
-import org.apache.sshd.common.keyprovider.FileKeyPairProvider;
import org.apache.sshd.common.util.SecurityUtils;
-import org.apache.sshd.server.UserAuth;
+import org.apache.sshd.server.SshServer;
import org.apache.sshd.server.auth.CachingPublicKeyAuthenticator;
-import org.apache.sshd.server.auth.UserAuthKeyboardInteractive;
-import org.apache.sshd.server.auth.UserAuthPassword;
-import org.apache.sshd.server.auth.UserAuthPublicKey;
+import org.apache.sshd.server.auth.UserAuth;
+import org.apache.sshd.server.auth.UserAuthKeyboardInteractiveFactory;
+import org.apache.sshd.server.auth.UserAuthPasswordFactory;
+import org.apache.sshd.server.auth.UserAuthPublicKeyFactory;
import org.apache.sshd.server.auth.gss.GSSAuthenticator;
-import org.apache.sshd.server.auth.gss.UserAuthGSS;
+import org.apache.sshd.server.auth.gss.UserAuthGSSFactory;
import org.bouncycastle.openssl.PEMWriter;
import org.eclipse.jgit.internal.JGitText;
import org.slf4j.Logger;
@@ -156,17 +155,17 @@ public class SshDaemon {
switch (authenticatorName) {
case "gssapi-with-mic":
if(gssAuthenticator != null) {
- userAuthFactories.add(new UserAuthGSS.Factory());
+ userAuthFactories.add(new UserAuthGSSFactory());
}
break;
case "publickey":
- userAuthFactories.add(new UserAuthPublicKey.Factory());
+ userAuthFactories.add(new UserAuthPublicKeyFactory());
break;
case "password":
- userAuthFactories.add(new UserAuthPassword.Factory());
+ userAuthFactories.add(new UserAuthPasswordFactory());
break;
case "keyboard-interactive":
- userAuthFactories.add(new UserAuthKeyboardInteractive.Factory());
+ userAuthFactories.add(new UserAuthKeyboardInteractiveFactory());
break;
default:
log.error("Unknown ssh authenticator: '{}'", authenticatorName);
@@ -257,7 +256,7 @@ public class SshDaemon {
try {
((SshCommandFactory) sshd.getCommandFactory()).stop();
sshd.stop();
- } catch (InterruptedException e) {
+ } catch (IOException e) {
log.error("SSH Daemon stop interrupted", e);
}
}
diff --git a/src/main/java/com/gitblit/transport/ssh/SshDaemonClient.java b/src/main/java/com/gitblit/transport/ssh/SshDaemonClient.java
index a5d4c3dd..af25251b 100644
--- a/src/main/java/com/gitblit/transport/ssh/SshDaemonClient.java
+++ b/src/main/java/com/gitblit/transport/ssh/SshDaemonClient.java
@@ -17,7 +17,7 @@ package com.gitblit.transport.ssh;
import java.net.SocketAddress;
-import org.apache.sshd.common.Session.AttributeKey;
+import org.apache.sshd.common.session.Session.AttributeKey;
import com.gitblit.models.UserModel;
diff --git a/src/main/java/com/gitblit/transport/ssh/SshKey.java b/src/main/java/com/gitblit/transport/ssh/SshKey.java
index 9c99d1a5..9fd1005a 100644
--- a/src/main/java/com/gitblit/transport/ssh/SshKey.java
+++ b/src/main/java/com/gitblit/transport/ssh/SshKey.java
@@ -22,7 +22,8 @@ import java.util.List;
import org.apache.commons.codec.binary.Base64;
import org.apache.sshd.common.SshException;
-import org.apache.sshd.common.util.Buffer;
+import org.apache.sshd.common.util.buffer.Buffer;
+import org.apache.sshd.common.util.buffer.ByteArrayBuffer;
import org.eclipse.jgit.lib.Constants;
import com.gitblit.Constants.AccessPermission;
@@ -72,7 +73,7 @@ public class SshKey implements Serializable {
}
final byte[] bin = Base64.decodeBase64(Constants.encodeASCII(parts[1]));
try {
- publicKey = new Buffer(bin).getRawPublicKey();
+ publicKey = new ByteArrayBuffer(bin).getRawPublicKey();
} catch (SshException e) {
throw new RuntimeException(e);
}
@@ -145,7 +146,7 @@ public class SshKey implements Serializable {
public String getRawData() {
if (rawData == null && publicKey != null) {
// build the raw data manually from the public key
- Buffer buf = new Buffer();
+ Buffer buf = new ByteArrayBuffer();
// 1: identify the algorithm
buf.putRawPublicKey(publicKey);
diff --git a/src/main/java/com/gitblit/transport/ssh/SshKeyAuthenticator.java b/src/main/java/com/gitblit/transport/ssh/SshKeyAuthenticator.java
index c28a2ed6..dc9d8a4e 100644
--- a/src/main/java/com/gitblit/transport/ssh/SshKeyAuthenticator.java
+++ b/src/main/java/com/gitblit/transport/ssh/SshKeyAuthenticator.java
@@ -19,7 +19,7 @@ import java.security.PublicKey;
import java.util.List;
import java.util.Locale;
-import org.apache.sshd.server.PublickeyAuthenticator;
+import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator;
import org.apache.sshd.server.session.ServerSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/src/main/java/com/gitblit/transport/ssh/SshServerSession.java b/src/main/java/com/gitblit/transport/ssh/SshServerSession.java
index d12a6be2..02504ec8 100644
--- a/src/main/java/com/gitblit/transport/ssh/SshServerSession.java
+++ b/src/main/java/com/gitblit/transport/ssh/SshServerSession.java
@@ -19,10 +19,10 @@ import org.apache.sshd.common.future.CloseFuture;
import org.apache.sshd.common.future.SshFutureListener;
import org.apache.sshd.common.io.IoSession;
import org.apache.sshd.server.ServerFactoryManager;
-import org.apache.sshd.server.session.ServerSession;
+import org.apache.sshd.server.session.ServerSessionImpl;
// Expose addition of close session listeners
-class SshServerSession extends ServerSession {
+class SshServerSession extends ServerSessionImpl {
SshServerSession(ServerFactoryManager server, IoSession ioSession) throws Exception {
super(server, ioSession);
diff --git a/src/main/java/com/gitblit/transport/ssh/SshServerSessionFactory.java b/src/main/java/com/gitblit/transport/ssh/SshServerSessionFactory.java
index 0c018f02..bc67cec0 100644
--- a/src/main/java/com/gitblit/transport/ssh/SshServerSessionFactory.java
+++ b/src/main/java/com/gitblit/transport/ssh/SshServerSessionFactory.java
@@ -67,6 +67,6 @@ public class SshServerSessionFactory extends SessionFactory {
@Override
protected AbstractSession doCreateSession(IoSession ioSession) throws Exception {
- return new SshServerSession(server, ioSession);
+ return new SshServerSession(getServer(), ioSession);
}
}
diff --git a/src/main/java/com/gitblit/transport/ssh/UsernamePasswordAuthenticator.java b/src/main/java/com/gitblit/transport/ssh/UsernamePasswordAuthenticator.java
index c4e69dcd..a6d77ec4 100644
--- a/src/main/java/com/gitblit/transport/ssh/UsernamePasswordAuthenticator.java
+++ b/src/main/java/com/gitblit/transport/ssh/UsernamePasswordAuthenticator.java
@@ -17,7 +17,7 @@ package com.gitblit.transport.ssh;
import java.util.Locale;
-import org.apache.sshd.server.PasswordAuthenticator;
+import org.apache.sshd.server.auth.password.PasswordAuthenticator;
import org.apache.sshd.server.session.ServerSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -57,7 +57,7 @@ public class UsernamePasswordAuthenticator implements PasswordAuthenticator {
return true;
}
- log.warn("could not authenticate {} for SSH using the supplied password", username);
+ log.warn("could not authenticate {} ({}) for SSH using the supplied password", username, client.getRemoteAddress());
return false;
}
}
diff --git a/src/main/java/com/gitblit/utils/JGitUtils.java b/src/main/java/com/gitblit/utils/JGitUtils.java
index 356a796c..c3d02073 100644
--- a/src/main/java/com/gitblit/utils/JGitUtils.java
+++ b/src/main/java/com/gitblit/utils/JGitUtils.java
@@ -30,7 +30,6 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Pattern;
-import com.google.common.base.Strings;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.eclipse.jgit.api.CloneCommand;
import org.eclipse.jgit.api.FetchCommand;
@@ -91,6 +90,7 @@ import com.gitblit.models.PathModel;
import com.gitblit.models.PathModel.PathChangeModel;
import com.gitblit.models.RefModel;
import com.gitblit.models.SubmoduleModel;
+import com.google.common.base.Strings;
/**
* Collection of static methods for retrieving information from a repository.
@@ -691,7 +691,10 @@ public class JGitUtils {
if (commit == null) {
return new Date(0);
}
- return commit.getAuthorIdent().getWhen();
+ if (commit.getAuthorIdent() != null) {
+ return commit.getAuthorIdent().getWhen();
+ }
+ return getCommitDate(commit);
}
/**
diff --git a/src/main/java/com/gitblit/utils/MarkdownUtils.java b/src/main/java/com/gitblit/utils/MarkdownUtils.java
index 2ebfdb26..e0c9dd4e 100644
--- a/src/main/java/com/gitblit/utils/MarkdownUtils.java
+++ b/src/main/java/com/gitblit/utils/MarkdownUtils.java
@@ -16,6 +16,7 @@
package com.gitblit.utils;
import static org.pegdown.Extensions.ALL;
+import static org.pegdown.Extensions.ANCHORLINKS;
import static org.pegdown.Extensions.SMARTYPANTS;
import java.io.IOException;
@@ -76,7 +77,7 @@ public class MarkdownUtils {
*/
public static String transformMarkdown(String markdown, LinkRenderer linkRenderer) {
try {
- PegDownProcessor pd = new PegDownProcessor(ALL & ~SMARTYPANTS);
+ PegDownProcessor pd = new PegDownProcessor(ALL & ~SMARTYPANTS & ~ANCHORLINKS);
RootNode astRoot = pd.parseMarkdown(markdown.toCharArray());
return new WorkaroundHtmlSerializer(linkRenderer == null ? new LinkRenderer() : linkRenderer).toHtml(astRoot);
} catch (ParsingTimeoutException e) {
diff --git a/src/main/java/com/gitblit/utils/MetricUtils.java b/src/main/java/com/gitblit/utils/MetricUtils.java
index 47031021..62427e6d 100644
--- a/src/main/java/com/gitblit/utils/MetricUtils.java
+++ b/src/main/java/com/gitblit/utils/MetricUtils.java
@@ -136,7 +136,7 @@ public class MetricUtils {
Iterable<RevCommit> revlog = revWalk;
for (RevCommit rev : revlog) {
- Date d = JGitUtils.getCommitDate(rev);
+ Date d = JGitUtils.getAuthorDate(rev);
String p = df.format(d);
if (!metricMap.containsKey(p)) {
metricMap.put(p, new Metric(p));
diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp_zh_TW.properties b/src/main/java/com/gitblit/wicket/GitBlitWebApp_zh_TW.properties
new file mode 100644
index 00000000..5e06b35a
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp_zh_TW.properties
@@ -0,0 +1,766 @@
+#!
+#! created/edited by Popeye version 0.54 (popeye.sourceforge.net)
+#! encoding:ISO-8859-1
+gb.about = \u95dc\u65bc
+gb.acceptNewPatchsets = \u5141\u8a31\u88dc\u4e01
+gb.acceptNewPatchsetsDescription = \u63a5\u53d7\u5230\u6587\u4ef6\u5009\u9032\u884c\u4fee\u88dc\u52d5\u4f5c
+gb.acceptNewTickets = \u5141\u8a31\u767c\u9001\u516c\u6587
+gb.acceptNewTicketsDescription = \u5141\u8a31\u65b0\u589e"\u81ed\u87f2","\u512a\u5316","\u4efb\u52d9"\u5404\u985e\u578b\u516c\u6587
+gb.accessDenied = \u62d2\u7d55\u5b58\u53d6
+gb.accessLevel = \u5b58\u53d6\u7b49\u7d1a
+gb.accessPermissions = \u5b58\u53d6\u6b0a\u9650
+gb.accessPermissionsDescription = restrict access by users and teams
+gb.accessPermissionsForTeamDescription = set team members and grant access to specific restricted repositories
+gb.accessPermissionsForUserDescription = set team memberships or grant access to specific restricted repositories
+gb.accessPolicy = \u5b58\u53d6\u653f\u7b56
+gb.accessPolicyDescription = \u9078\u64c7\u7528\u4f86\u63a7\u5236\u6587\u4ef6\u5eab\u7684\u5b58\u53d6\u653f\u7b56\u4ee5\u53ca\u6b0a\u9650\u8a2d\u5b9a
+gb.accessRestriction = \u9650\u5236\u5b58\u53d6
+gb.accountPreferences = \u5e33\u865f\u8a2d\u5b9a
+gb.accountPreferencesDescription = \u8a2d\u5b9a\u5e33\u865f\u9810\u8a2d\u503c
+gb.action = \u52d5\u4f5c
+gb.active = \u6d3b\u8e8d
+gb.activeAuthors = \u6d3b\u8e8d\u7528\u6236
+gb.activeRepositories = \u6d3b\u8e8d\u6587\u4ef6\u5eab
+gb.activity = \u6d3b\u8e8d
+gb.add = \u65b0\u589e
+gb.addComment = \u65b0\u589e\u8a3b\u89e3
+gb.addedNCommits = {0}\u500b\u6a94\u6848\u63d0\u4ea4\u5b8c\u7562
+gb.addedOneCommit = \u63d0\u4ea41\u500b\u6a94\u6848
+gb.addition = addition
+gb.addSshKey = \u65b0\u589e SSH Key
+gb.administration = \u7ba1\u7406\u6b0a\u9650
+gb.administrator = \u7ba1\u7406\u54e1
+gb.administratorPermission = Gitblit \u7ba1\u7406\u54e1
+gb.affiliationChanged = affiliation changed
+gb.age = age
+gb.all = \u5168\u90e8
+gb.allBranches = \u6240\u6709\u5206\u652f
+gb.allowAuthenticatedDescription = \u6279\u51c6 RW+ \u6b0a\u9650\u7d66\u4e88\u5c08\u6848\u6210\u54e1
+gb.allowForks = \u5141\u8a31\u5efa\u7acb\u5206\u652f(forks)
+gb.allowForksDescription = \u5141\u8a31\u5df2\u6388\u6b0a\u7684\u4f7f\u7528\u8005\u5f9e\u6587\u4ef6\u5eab\u5efa\u7acb\u5206\u652f(fork)
+gb.allowNamedDescription = grant fine-grained permissions to named users or teams
+gb.allProjects = \u5168\u90e8\u7fa4\u7d44
+gb.allTags = \u6240\u6709\u6a19\u7c64
+gb.anonymousCanNotPropose = \u533f\u540d\u8005\u4e0d\u80fd\u63d0\u4f9b\u88dc\u4e01
+gb.anonymousPolicy = \u533f\u540d\u72c0\u614b\u53ef\u4ee5View, Clone\u8207Push
+gb.anonymousPolicyDescription = \u4efb\u4f55\u4eba\u53ef\u6aa2\u8996,\u8907\u88fd(clone)\u8207\u63a8\u9001(push)\u6587\u4ef6\u5230\u6587\u4ef6\u5eab
+gb.anonymousUser= \u533f\u540d\u72c0\u614b
+gb.any = \u4efb\u4f55
+gb.approve = \u901a\u904e
+gb.at = at
+gb.attributes = \u5c6c\u6027
+gb.authenticatedPushPolicy = Restrict Push (Authenticated)
+gb.authenticatedPushPolicyDescription = \u4efb\u4f55\u4eba\u53ef\u4ee5\u6aa2\u8996\u8207\u8907\u88fd(clone).\u6240\u6709\u6587\u4ef6\u5eab\u6210\u54e1\u7686\u6709RW+\u8207\u63a8\u9001(push)\u529f\u80fd.
+gb.author = \u4f5c\u8005
+gb.authored = \u5df2\u6388\u6b0a
+gb.authorizationControl = \u6388\u6b0a\u7ba1\u63a7
+gb.available = \u53ef\u7528
+gb.blame = \u8ffd\u67e5
+gb.blinkComparator = Blink comparator
+gb.blob = \u5340\u584a
+gb.body = body
+gb.bootDate = \u555f\u52d5\u65e5
+gb.branch = \u5206\u652f
+gb.branches = \u5206\u652f
+gb.branchStats = \u9019\u500b\u5206\u652f{2}\u6709{0}\u500b\u63d0\u4ea4\u4ee5\u53ca{1}\u500b\u6a19\u7c64
+gb.browse = \u700f\u89bd
+gb.bugTickets = \u81ed\u87f2
+gb.busyCollectingGarbage = \u62b1\u6b49,Gitblit\u6b63\u5728\u56de\u6536\u7cfb\u7d71\u8cc7\u6e90\u4e2d:{0}
+gb.byNAuthors = \u7d93\u7531{0}\u500b\u4f5c\u8005
+gb.byOneAuthor = \u7d93\u7531{0}
+gb.caCompromise = CA compromise
+gb.canAdmin = \u53ef\u7ba1\u7406
+gb.canAdminDescription = \u53ef\u7ba1\u7406Gitblit\u4f3a\u670d\u5668
+gb.cancel = \u53d6\u6d88
+gb.canCreate = \u53ef\u5efa\u7acb
+gb.canCreateDescription = \u80fd\u5920\u5efa\u7acb\u79c1\u4eba\u6587\u4ef6\u5eab
+gb.canFork = \u53ef\u5efa\u7acb\u5206\u652f(fork)
+gb.canForkDescription = \u53ef\u4ee5\u5efa\u7acb\u6587\u4ef6\u5eab\u5206\u652f(fork),\u4e26\u4e14\u8907\u88fd\u5230\u79c1\u4eba\u6587\u4ef6\u5eab\u4e2d
+gb.canNotLoadRepository = \u7121\u6cd5\u8f09\u5165\u7248\u672c\u5eab
+gb.canNotProposePatchset = \u4e0d\u80fd\u63d0\u4f9b\u88dc\u4e01
+gb.certificate = \u8b49\u66f8
+gb.certificateRevoked = \u8b49\u66f8{0,number,0} \u5df2\u7d93\u88ab\u53d6\u6d88
+gb.certificates = \u8b49\u66f8
+gb.cessationOfOperation = cessation of operation
+gb.changedFiles = \u5df2\u8b8a\u66f4\u904e\u7684\u6a94\u6848
+gb.changedStatus = changed the status
+gb.changePassword = \u4fee\u6539\u5bc6\u78bc
+gb.checkout = checkout
+gb.checkoutStep1 = Fetch the current patchset \u2014 run this from your project directory
+gb.checkoutStep2 = \u5c07\u8a72\u88dc\u4e01\u8f49\u51fa\u5230\u65b0\u7684\u5206\u652f\u7136\u5f8c\u7528\u4f86\u6aa2\u8996
+gb.checkoutViaCommandLine = \u4e0b\u6307\u4ee4Checkout
+gb.checkoutViaCommandLineNote = \u4f60\u53ef\u4ee5\u5f9e\u4f60\u6587\u4ef6\u5eab\u4e2dcheckout\u4e00\u4efd,\u7136\u5f8c\u9032\u884c\u6e2c\u8a66
+gb.clearCache = \u6e05\u9664\u5feb\u53d6
+gb.clientCertificateBundleSent = {0}\u7684\u7528\u6236\u8b49\u66f8\u5df2\u5bc4\u767c
+gb.clientCertificateGenerated = \u6210\u529f\u7522\u751f{0}\u7684\u65b0\u8b49\u66f8
+gb.clone = \u8907\u88fd(clone)
+gb.clonePermission = {0} \u8907\u88fd(clone)
+gb.clonePolicy = Restrict Clone & Push
+gb.clonePolicyDescription = \u4efb\u4f55\u4eba\u53ef\u4ee5\u770b\u6587\u4ef6\u5eab. \u4f46\u4f60\u80fd\u5920\u8907\u88fd(clone)\u8207\u63a8\u9001(push)
+gb.cloneRestricted = authenticated clone & push
+gb.closeBrowser = \u8acb\u95dc\u9589\u700f\u89bd\u5668\u7d50\u675f\u6b64\u767b\u5165\u968e\u6bb5
+gb.closed = \u95dc\u9589
+gb.closedMilestones = \u5df2\u95dc\u9589\u7684\u91cc\u7a0b\u7891(milestones)
+gb.combinedMd5Rename = Gitblit\u4f7f\u7528md5\u65b9\u5f0f\u5c07\u5bc6\u78bc\u7de8\u78bc(\u7121\u6cd5\u9084\u539f).\u4f60\u5fc5\u9808\u8f38\u5165\u65b0\u5bc6\u78bc.
+gb.comment = \u8a3b\u89e3
+gb.commented = \u5df2\u8a3b\u89e3
+gb.comments = \u8a3b\u89e3
+gb.commit = \u63d0\u4ea4
+gb.commitActivityAuthors = \u63d0\u4ea4\u6d3b\u8e8d\u7387(\u4f7f\u7528\u8005)
+gb.commitActivityDOW = \u6bcf(\u65e5)\u9031\u63d0\u4ea4
+gb.commitActivityTrend = \u63d0\u4ea4\u8da8\u52e2\u5716
+gb.commitdiff = \u6bd4\u5c0d\u5dee\u7570
+gb.commitIsNull = \u63d0\u4ea4\u5167\u5bb9\u662f\u7a7a\u7684
+gb.commitMessageRenderer = \u63d0\u4ea4\u8a0a\u606f\u5448\u73fe\u65b9\u5f0f
+gb.commitMessageRendererDescription = \u63d0\u4ea4\u8a0a\u606f\u53ef\u4ee5\u4f7f\u7528\u6587\u5b57\u6216\u662f\u6a19\u8a18\u8a9e\u8a00(markup)\u5448\u73fe
+gb.commits = \u63d0\u4ea4
+gb.commitsInPatchsetN = commits in patchset {0}
+gb.commitsTo = {0} commits to
+gb.committed = \u5df2\u63d0\u4ea4
+gb.committer = \u78ba\u8a8d\u63d0\u4ea4\u8005
+gb.compare = \u6bd4\u5c0d
+gb.compareToMergeBase = \u6bd4\u5c0d\u5f8c,\u5408\u4f75\u5230\u4e3b\u8981\u5de5\u4f5c\u5340
+gb.compareToN = \u8207{0}\u9032\u884c\u6bd4\u5c0d
+gb.completeGravatarProfile = \u5b8c\u6210Gravator.com\u4e0a\u7684\u57fa\u672c\u8cc7\u6599\u8a2d\u5b9a
+gb.confirmPassword = \u78ba\u8a8d\u5bc6\u78bc
+gb.content = \u5167\u5bb9
+gb.copyToClipboard = \u8907\u88fd\u5230\u526a\u8cbc\u677f
+gb.couldNotCreateFederationProposal = \u7121\u6cd5\u5efa\u7acb\u4e32\u9023\u7684\u5408\u4f5c\u63d0\u6848
+gb.couldNotFindFederationProposal = \u641c\u5c0b\u4e0d\u5230\u8981\u6c42\u4e32\u9023\u7684\u63d0\u6848
+gb.couldNotFindFederationRegistration = \u627e\u4e0d\u5230\u4e32\u9023\u8a3b\u518a\u55ae
+gb.couldNotFindTag = \u627e\u4e0d\u5230\u6a19\u7c64{0}
+gb.countryCode = \u570b\u5bb6\u4ee3\u78bc
+gb.create = \u5efa\u7acb
+gb.createdBy = created by
+gb.createdNewBranch = \u5efa\u7acb\u65b0\u5206\u652f
+gb.createdNewPullRequest = created pull request
+gb.createdNewTag = \u5efa\u7acb\u65b0\u6a19\u7c64
+gb.createdThisTicket = created this ticket
+gb.createFirstTicket = \u6309\u6b64\u9996\u767c\u516c\u6587
+gb.createPermission = {0} (push, ref creation)
+gb.createReadme = \u5efa\u7acbREADME\u6a94\u6848
+gb.customFields = custom fields
+gb.customFieldsDescription = custom fields available to Groovy hooks
+gb.dailyActivity = \u6bcf\u65e5\u6d3b\u8e8d
+gb.dashboard = \u5100\u8868\u677f
+gb.date = \u65e5\u671f
+gb.default = \u9810\u8a2d
+gb.delete = \u522a\u9664
+gb.deletedBranch = deleted branch
+gb.deletedTag = \u522a\u9664\u6a19\u7c64
+gb.deleteMilestone = \u522a\u9664\u91cc\u7a0b\u7891"{0}"?
+gb.deletePermission = {0} (push, ref creation+deletion)
+gb.deleteRepository = \u522a\u9664\u7248\u672c\u5eab"{0}"?
+gb.deleteRepositoryDescription = \u7248\u672c\u5eab\u522a\u9664\u5c07\u7121\u6cd5\u9084\u539f
+gb.deleteRepositoryHeader = \u522a\u9664\u7248\u672c\u5eab
+gb.deleteUser = \u522a\u9664\u4f7f\u7528\u8005"{0}"?
+gb.deletion = \u522a\u9664
+gb.description = \u6982\u8ff0
+gb.destinationUrl = \u50b3\u9001
+gb.destinationUrlDescription = \u50b3\u9001Gitblit\u9023\u7d50\u5230\u4f60\u7684\u5c08\u6848(proposal)
+gb.diff = \u5dee\u7570
+gb.diffCopiedFile = File was copied from {0}
+gb.diffDeletedFile = \u6a94\u6848\u5df2\u522a\u9664
+gb.diffDeletedFileSkipped = (\u522a\u9664)
+gb.diffFileDiffTooLarge = \u6a94\u6848\u592a\u5927
+gb.diffNewFile = \u6bd4\u5c0d\u65b0\u6a94\u6848
+gb.diffRenamedFile = File was renamed from {0}
+gb.diffStat = \u65b0\u589e{0}\u5217\u8207\u522a\u9664{1}\u5217
+gb.difftocurrent = \u8207\u73fe\u6709\u6bd4\u5c0d\u5dee\u7570
+gb.diffTruncated = Diff truncated after the above file
+gb.disableUser = \u505c\u7528\u5e33\u6236
+gb.disableUserDescription = \u8a72\u5e33\u6236\u7121\u6cd5\u4f7f\u7528
+gb.discussion = \u8a0e\u8ad6
+gb.displayName = \u986f\u793a\u7684\u540d\u7a31
+gb.displayNameDescription = \u5e0c\u671b\u986f\u793a\u7684\u540d\u7a31
+gb.docs = \u6a94\u6848\u5340
+gb.docsWelcome1 = \u4f60\u53ef\u4ee5\u4f7f\u7528\u6a94\u6848\u5340\u5efa\u7acb\u6587\u4ef6\u5eab\u7684\u6559\u5b78\u6a94\u6848
+gb.docsWelcome2 = \u63d0\u4ea4README.md \u6216 HOME.md\u5f8c,\u518d\u958b\u59cb\u65b0\u7684\u6587\u4ef6\u5eab
+gb.doesNotExistInTree = {0}\u4e26\u6c92\u6709\u5728\u76ee\u9304{1}\u88e1\u9762
+gb.download = \u4e0b\u8f09
+gb.downloading = \u4e0b\u8f09ing
+gb.due = due
+gb.duration = \u9031\u671f
+gb.duration.days = {0}\u5929
+gb.duration.months = {0}\u6708
+gb.duration.oneDay = 1\u5929
+gb.duration.oneMonth = 1\u6708
+gb.duration.oneYear = 1\u5e74
+gb.duration.years = {0}\u5e74
+gb.edit = \u7de8\u8f2f
+gb.editMilestone = \u4fee\u6539milestone
+gb.editTicket = \u4fee\u6539\u516c\u6587
+gb.editUsers = \u4fee\u6539\u5e33\u865f
+gb.effective = \u6240\u6709\u6b0a\u9650
+gb.emailAddress = \u96fb\u5b50\u90f5\u4ef6
+gb.emailAddressDescription = \u7528\u4f86\u63a5\u6536\u901a\u77e5\u7684\u4e3b\u8981\u96fb\u5b50\u90f5\u4ef6
+gb.emailCertificateBundle = \u5bc4\u767c\u7528\u6236\u7aef\u8b49\u66f8
+gb.emailMeOnMyTicketChanges = \u6211\u7684\u516c\u6587\u82e5\u6709\u8b8a\u66f4,\u8acb800\u91cc\u52a0\u6025(email)\u901a\u77e5\u6211
+gb.emailMeOnMyTicketChangesDescription = \u82e5\u516c\u6587\u884c\u7a0b\u8b8a\u66f4\u8acbemail\u901a\u77e5\u6211
+gb.empty = \u7a7a\u7684
+gb.emptyRepository = \u7a7a\u7684\u7248\u672c\u5eab
+gb.enableDocs = \u555f\u7528\u6a94\u6848\u5340
+gb.enableIncrementalPushTags = \u555f\u7528\u81ea\u52d5\u65b0\u589e\u6a19\u7c64\u529f\u80fd
+gb.enableTickets = \u555f\u7528\u516c\u6587\u7cfb\u7d71
+gb.enhancementTickets = \u512a\u5316
+gb.enterKeystorePassword = \u8acb\u8f38\u5165Gitblit\u7684keystore\u5c08\u7528\u5bc6\u78bc
+gb.error = \u932f\u8aa4
+gb.errorAdministrationDisabled = \u7ba1\u7406\u6b0a\u9650\u5df2\u53d6\u6d88
+gb.errorAdminLoginRequired = \u767b\u5165\u9700\u6709\u7ba1\u7406\u6b0a\u9650
+gb.errorOnlyAdminMayCreateRepository = \u53ea\u6709\u7ba1\u7406\u8005\u80fd\u5efa\u7acb\u7248\u672c\u5eab
+gb.errorOnlyAdminOrOwnerMayEditRepository = \u53ea\u6709\u7ba1\u7406\u8005\u8207\u7248\u672c\u5eab\u64c1\u6709\u8005\u80fd\u4fee\u6539\u7248\u672c\u5eab\u5c6c\u6027
+gb.excludeFromActivity = exclude from activity page
+gb.excludeFromFederation = \u6392\u9664\u4e32\u9023
+gb.excludeFromFederationDescription = \u963b\u64cb\u5df2\u4e32\u9023\u7684Gitblit\u4f3a\u670d\u5668
+gb.excludePermission = {0} (\u6392\u9664)
+gb.exclusions = exclusions
+gb.expired = \u904e\u671f
+gb.expires = \u5230\u671f
+gb.expiring = expiring
+gb.export = \u532f\u51fa
+gb.extensions = extensions
+gb.externalPermissions = {0} access permissions are externally maintained
+gb.failedToFindAccount = \u7121\u6cd5\u641c\u5c0b\u5230\u5e33\u865f"{0}"
+gb.failedToFindCommit = Failed to find commit "{0}" in {1}\!
+gb.failedToFindGravatarProfile = \u7121\u6cd5\u627e\u5230\u5e33\u865f{0}\u7684Gravator\u8cc7\u6599
+gb.failedtoRead = \u8b80\u53d6\u5931\u6557
+gb.failedToReadMessage = Failed to read default message from {0}\!
+gb.failedToSendProposal = Failed to send proposal\!
+gb.failedToUpdateUser = \u7121\u6cd5\u66f4\u65b0\u4f7f\u7528\u8005\u5e33\u865f
+gb.federatedRepositoryDefinitions = repository definitions
+gb.federatedSettingDefinitions = setting definitions
+gb.federatedUserDefinitions = user definitions
+gb.federateOrigin = federate the origin
+gb.federateThis = \u8207\u672c\u6587\u4ef6\u5eab\u4e32\u9023
+gb.federation = \u4e32\u9023
+gb.federationRegistration = federation registration
+gb.federationRepositoryDescription = \u8207\u5176\u4ed6gitblit\u4f3a\u670d\u5668\u5206\u4eab\u4e00\u8d77\u4f7f\u7528\u9019\u500b\u7248\u672c\u5eab
+gb.federationResults = federation pull results
+gb.federationSets = \u4e32\u9023\u7d44\u5408
+gb.federationSetsDescription = \u6b64\u6587\u4ef6\u5eab\u5c07\u5305\u542b\u65bc\u6307\u5b9a\u7684\u4e32\u9023\u7fa4\u7d44(federation sets)
+gb.federationStrategy = \u4e32\u9023\u7b56\u7565
+gb.federationStrategyDescription = \u63a7\u5236\u5982\u4f55\u5c07\u6587\u4ef6\u5eab\u8207\u5176\u4ed6Gitblit\u7248\u63a7\u4f3a\u670d\u5668\u4e32\u9023
+gb.feed = \u8cc7\u6599\u8a02\u95b1
+gb.filesAdded = \u65b0\u589e{0}\u500b\u6a94\u6848
+gb.filesCopied = \u8907\u88fd{0}\u500b\u6a94\u6848
+gb.filesDeleted = \u522a\u9664{0}\u500b\u6a94\u6848
+gb.filesModified = \u4fee\u6539{0}\u500b\u6a94\u6848
+gb.filesRenamed = \u4fee\u6539{0}\u500b\u6a94\u6848\u540d\u7a31
+gb.filter = \u689d\u4ef6\u904e\u6ffe
+gb.filters = \u67e5\u8a62\u689d\u4ef6
+gb.findSomeRepositories = \u641c\u5c0b\u6587\u4ef6\u5eab
+gb.folder = \u76ee\u9304
+gb.fork = \u5efa\u7acb\u5206\u652f(fork)
+gb.forkedFrom = forked from
+gb.forkInProgress = fork in progress
+gb.forkNotAuthorized = \u5f88\u62b1\u6b49, \u4f60\u7121\u5efa\u7acb\u6587\u4ef6\u5eab{0}\u5206\u652f(fork)\u7684\u6b0a\u9650
+gb.forkRepository = \u7248\u672c\u5eab{0}\u5efa\u7acb\u5206\u652f(fork)?
+gb.forks = \u5206\u652f(forks)
+gb.forksProhibited = \u7981\u6b62\u5efa\u7acb\u5206\u652f(forks)
+gb.forksProhibitedWarning = \u672c\u6587\u4ef6\u5eab\u7981\u6b62\u5206\u652f(fork)
+gb.free = \u91cb\u653e
+gb.frequency = frequency
+gb.from = from
+gb.garbageCollection = \u56de\u6536\u7cfb\u7d71\u8cc7\u6e90
+gb.garbageCollectionDescription = \u7cfb\u7d71\u8cc7\u6e90\u56de\u6536\u529f\u80fd\u5c07\u6703\u6574\u9813\u9b06\u6563\u7528\u6236\u7aef\u63a8\u9001(push)\u7684\u7269\u4ef6, \u4e5f\u6703\u79fb\u9664\u6587\u4ef6\u5eab\u4e0a\u7121\u7528\u7684\u7269\u4ef6
+gb.gc = \u7cfb\u7d71\u8cc7\u6e90\u56de\u6536\u5668
+gb.gcPeriod = \u7cfb\u7d71\u8cc7\u6e90\u56de\u6536\u968e\u6bb5
+gb.gcPeriodDescription = \u56de\u6536\u9031\u671f
+gb.gcThreshold = GC \u57fa\u6578(threshold)
+gb.gcThresholdDescription = \u89f8\u767c\u7cfb\u7d71\u8cc7\u6e90\u56de\u6536\u7684\u6700\u5c0f\u7269\u4ef6\u5bb9\u91cf
+gb.general = \u4e00\u822c
+gb.generalDescription = \u4e00\u822c\u8a2d\u5b9a
+gb.hasNotReviewed = \u5c1a\u672a\u6aa2\u6838\u904e
+gb.head = HEAD
+gb.headRef = \u9810\u8a2d\u5206\u652f(HEAD)
+gb.headRefDescription = \u9810\u8a2d\u5206\u652f\u5c07\u6703\u8907\u88fd\u4ee5\u53ca\u986f\u793a\u5230\u532f\u7e3d\u9801\u9762
+gb.heapAllocated = allocated heap
+gb.heapMaximum = \u6700\u5927\u5806\u7a4d(heap)
+gb.heapUsed = \u5df2\u4f7f\u7528\u7684\u5806\u7a4d(heap)
+gb.history = \u6b77\u53f2
+gb.home = \u9996\u9801
+gb.hookScripts = hook\u7684\u8173\u672c
+gb.hookScriptsDescription = \u7576\u63a8\u9001(push)\u81f3\u6b64Gitblit\u7248\u63a7\u4f3a\u670d\u5668\u6642, \u57f7\u884cGroovy\u8173\u672c
+gb.hostname = \u4e3b\u6a5f\u540d\u7a31
+gb.hostnameRequired = \u8acb\u8f38\u5165\u4e3b\u6a5f\u540d\u7a31
+gb.ignore_whitespace =\u5ffd\u7565\u7a7a\u767d
+gb.illegalCharacterRepositoryName = \u7248\u672c\u5eab\u540d\u7a31\u6709\u4e0d\u5408\u6cd5\u7684\u5b57\u5143"{0}"
+gb.illegalLeadingSlash = \u7981\u6b62\u6839\u76ee\u9304(/)
+gb.illegalPersonalRepositoryLocation = \u4f60\u79c1\u4eba\u7248\u672c\u5eab\u5fc5\u9808\u653e\u5728"{0}"
+gb.illegalRelativeSlash = \u7981\u6b62\u76f8\u5c0d\u76ee\u9304(../)
+gb.imgdiffSubtract = Subtract (black = identical)
+gb.in = in
+gb.inclusions = inclusions
+gb.incrementalPushTagMessage = \u7576[{0}]\u5206\u652f\u63a8\u9001\u5f8c,\u81ea\u52d5\u7d66\u4e88\u6a19\u7c64\u865f.
+gb.indexedBranches = \u5206\u652f\u7d22\u5f15
+gb.indexedBranchesDescription = \u9078\u5b9a\u6b32\u57f7\u884cLucene\u7d22\u5f15\u529f\u80fd\u7684\u5206\u652f
+gb.inherited = \u7e7c\u627f
+gb.initialCommit = \u521d\u6b21\u63d0\u4ea4
+gb.initialCommitDescription = \u4ee5\u4e0b\u6b65\u9a5f\u5c07\u6703\u8b93\u4f60\u99ac\u4e0a\u57f7\u884c<code>git clone</code>.\u5982\u679c\u4f60\u672c\u6a5f\u5df2\u6709\u6b64\u6587\u4ef6\u5eab\u4e14\u57f7\u884c\u904e<code>git init</code>,\u8acb\u8df3\u904e\u6b64\u6b65\u9a5f.
+gb.initWithGitignore = \u5305\u542b .gitignore \u6a94\u6848
+gb.initWithGitignoreDescription = \u65b0\u589e\u4e00\u500b\u8a2d\u5b9a\u6a94\u7528\u4f86\u6307\u5b9a\u54ea\u4e9b\u6a94\u6848\u6216\u76ee\u9304\u9700\u8981\u5ffd\u7565
+gb.initWithReadme = \u5305\u542bREADME\u6587\u4ef6
+gb.initWithReadmeDescription = \u6587\u4ef6\u5eab\u5c07\u7522\u751f\u7c21\u55aeREADME\u6587\u4ef6
+gb.invalidExpirationDate = \u4e0d\u6b63\u78ba\u7684\u5230\u671f\u65e5
+gb.invalidUsernameOrPassword = \u932f\u8aa4\u7684\u4f7f\u7528\u8005\u540d\u7a31\u6216\u5bc6\u78bc!
+gb.isFederated = \u5df2\u7d93\u4e32\u9023
+gb.isFork = \u662f\u5206\u652f\u985e\u578b(fork)
+gb.isFrozen = \u51cd\u7d50\u63a5\u6536
+gb.isFrozenDescription = \u7981\u6b62\u63a8\u9001(push)
+gb.isMirror = \u8a72\u6587\u4ef6\u5eab\u70ba\u93e1\u50cf(mirror)
+gb.isNotValidFile = \u4e0d\u662f\u6b63\u5e38\u6a94\u6848
+gb.isSparkleshared = \u8a72\u6587\u4ef6\u5eab\u5df2\u70baSparkleshared (http://sparkleshare.org)
+gb.issued = \u767c\u51fa
+gb.issuer = issuer
+gb.jceWarning = Your Java Runtime Environment does not have the "JCE Unlimited Strength Jurisdiction Policy" files.\nThis will limit the length of passwords you may use to encrypt your keystores to 7 characters.\nThese policy files are an optional download from Oracle.\n\nWould you like to continue and generate the certificate infrastructure anyway?\n\nAnswering No will direct your browser to Oracle's download page so that you may download the policy files.
+gb.key = \u91d1\u9470
+gb.keyCompromise = \u91d1\u9470\u5bc6\u78bc\u5916\u6d29
+gb.labels = \u6a19\u8a18
+gb.languagePreference = \u5e38\u7528\u8a9e\u8a00
+gb.languagePreferenceDescription = \u9078\u64c7\u4f60\u60f3\u8981\u7684Gitblit\u7ffb\u8b6f
+gb.lastChange = \u6700\u8fd1\u4fee\u6539
+gb.lastLogin = \u6700\u8fd1\u767b\u5165
+gb.lastNDays = \u6700\u8fd1{0}\u5929
+gb.lastPull = \u4e0a\u6b21\u4e0b\u8f09(pull)
+gb.leaveComment = \u7559\u4e0b\u8a3b\u89e3
+gb.line = line
+gb.loading = \u8f09\u5165
+gb.local = \u672c\u5730\u7aef
+gb.locality = \u4f4d\u7f6e
+gb.log = \u65e5\u8a8c
+gb.login = \u767b\u5165
+gb.logout = \u767b\u51fa
+gb.looksGood = \u770b\u8d77\u4f86\u5f88\u597d
+gb.luceneDisabled = \u505c\u7528Lucene\u7d22\u5f15\u529f\u80fd
+gb.mailingLists = \u90f5\u4ef6\u540d\u55ae
+gb.maintenanceTickets = \u7dad\u8b77
+gb.manage = \u7ba1\u7406
+gb.manual = \u624b\u52d5
+gb.markdown = markdown
+gb.markdownFailure = \u89e3\u6790Markdown\u5931\u6557
+gb.maxActivityCommits = \u6700\u5927\u63d0\u4ea4\u6d3b\u8e8d\u7387
+gb.maxActivityCommitsDescription = \u6700\u5927\u63d0\u4ea4\u6d3b\u8e8d\u6578\u91cf
+gb.maxHits = \u6700\u5927\u9ede\u64ca
+gb.md5FingerPrint = MD5 Fingerprint
+gb.mentions = \u63d0\u5230
+gb.mentionsMeTickets = \u63d0\u5230\u4f60
+gb.merge = \u5408\u4f75
+gb.mergeBase = \u8207base\u5408\u4f75
+gb.merged = \u5df2\u5408\u4f75
+gb.mergedPatchset = \u8207\u88dc\u4e01\u5408\u4f75
+gb.mergedPullRequest = \u5408\u4f75\u63a8\u9001\u8981\u6c42
+gb.mergeSha = mergeSha
+gb.mergeStep1 = Check out a new branch to review the changes \u2014 run this from your project directory
+gb.mergeStep2 = Bring in the proposed changes and review
+gb.mergeStep3 = \u5c07\u63d0\u6848\u4fee\u6539\u5167\u5bb9\u5408\u4f75\u5230\u4f3a\u670d\u5668\u4e0a
+gb.mergeTo = \u5408\u4f75\u5230
+gb.mergeToDescription = \u9810\u8a2d\u5c07\u6587\u4ef6\u76f8\u95dc\u88dc\u4e01\u5305\u8207\u6307\u5b9a\u5206\u652f(branch)\u5408\u4f75
+gb.mergingViaCommandLine = \u7d93\u7531\u6307\u4ee4\u57f7\u884c\u5408\u4f75
+gb.mergingViaCommandLineNote = \u5982\u679c\u4f60\u4e0d\u60f3\u8981\u4f7f\u7528\u81ea\u52d5\u5408\u4f75\u529f\u80fd,\u6216\u662f\u6309\u4e0b\u5408\u4f75\u6309\u9215, \u4f60\u53ef\u4ee5\u4e0b\u6307\u4ee4\u624b\u52d5\u5408\u4f75
+gb.message = \u8a0a\u606f
+gb.metricAuthorExclusions = \u91cf\u5316\u7d71\u8a08\u6642\u6392\u9664\u6d3b\u8e8d\u5e33\u6236
+gb.metrics = \u91cf\u5316\u7d71\u8a08
+gb.milestone = \u91cc\u7a0b\u7891
+gb.milestoneDeleteFailed = \u522a\u9664\u91cc\u7a0b\u7891"{0}"\u5931\u6557
+gb.milestoneProgress = {0}\u958b\u555f,{1}\u7d50\u675f
+gb.milestones = \u91cc\u7a0b\u7891
+gb.mirrorOf = {0}\u7684\u93e1\u50cf
+gb.mirrorWarning = \u8a72\u6587\u4ef6\u5eab\u5c6c\u65bc\u93e1\u50cf, \u4e0d\u80fd\u5920\u63a5\u6536\u63a8\u9001(push)
+gb.miscellaneous = \u5176\u4ed6
+gb.missing = \u5931\u8aa4!
+gb.missingIntegrationBranchMore = \u76ee\u6a19\u5206\u652f\u4e0d\u5728\u6b64\u7248\u672c\u5eab
+gb.missingPermission = the repository for this permission is missing\!
+gb.missingUsername = \u7f3a\u5c11\u4f7f\u7528\u8005\u540d\u7a31
+gb.modification = \u4fee\u6539
+gb.monthlyActivity = \u6708\u6d3b\u8e8d
+gb.moreChanges = \u6240\u6709\u8b8a\u66f4...
+gb.moreHistory = \u66f4\u591a\u6b77\u53f2\u7d00\u9304...
+gb.moreLogs = \u66f4\u591a\u63d0\u4ea4 ...
+gb.mutable = \u52d5\u614b\u7d66\u4e88
+gb.myDashboard = \u6211\u7684\u5100\u8868\u677f
+gb.myFork = \u6aa2\u8996\u6211\u5efa\u7acb\u7684\u5206\u652f(fork)
+gb.myProfile = \u6211\u7684\u57fa\u672c\u8cc7\u6599
+gb.myRepositories = \u6211\u7684\u6587\u4ef6\u5eab
+gb.myTickets = \u6211\u7684\u516c\u6587
+gb.myUrlDescription = \u4f60Gitblit\u4f3a\u670d\u5668\u7684\u516c\u958bURL
+gb.name = \u540d\u5b57
+gb.nameDescription = \u4f7f\u7528"/"\u505a\u70ba\u6587\u4ef6\u5eab\u7fa4\u7d44\u5206\u985e. \u5982: library/mycoolib.git
+gb.namedPushPolicy = Restrict Push (Named)
+gb.namedPushPolicyDescription = \u4efb\u4f55\u4eba\u7686\u53ef\u6aa2\u8996\u8207\u8907\u88fd(clone)\u6587\u4ef6\u5eab. \u4f60\u53ef\u53e6\u5916\u6307\u5b9a\u8ab0\u80fd\u5920\u6709\u63a8\u9001\u529f\u80fd(push)
+gb.nAttachments = {0}\u500b\u9644\u4ef6
+gb.nClosedTickets = {0}\u9805\u7d50\u675f
+gb.nComments = {0}\u500b\u8a3b\u89e3
+gb.nCommits = {0}\u4efd\u63d0\u4ea4
+gb.needsImprovement = \u9700\u8981\u512a\u5316
+gb.new = \u5efa\u7acb
+gb.newCertificate = \u5efa\u7acb\u8b49\u66f8
+gb.newCertificateDefaults = \u65b0\u8b49\u66f8\u9810\u8a2d\u503c
+gb.newClientCertificateMessage = \u6ce8\u610f:\n'password'\u5bc6\u78bc\u4e26\u4e0d\u662f\u4f7f\u7528\u8005\u5bc6\u78bc, \u800c\u662f\u7528\u4f86\u4fdd\u8b77\u4f7f\u7528\u8005\u500b\u4eba\u7684keystore.\u8a72\u5bc6\u78bc\u4e26\u4e0d\u6703\u5132\u5b58, \u56e0\u6b64\u5fc5\u9808\u8a2d\u5b9a\u63d0\u793a(hint), \u8a72\u63d0\u793a\u5c07\u6703\u5beb\u5728\u4f7f\u7528\u8005\u7684README\u6587\u4ef6\u88e1\u9762.
+gb.newMilestone = \u5efa\u7acb\u91cc\u7a0b\u7891
+gb.newRepository = \u5efa\u7acb\u7248\u672c\u5eab
+gb.newSSLCertificate = \u65b0\u7684\u4f3a\u670d\u5668SSL\u8b49\u66f8
+gb.newTeam = \u5efa\u7acb\u5718\u968a
+gb.newTicket = \u767c\u65b0\u516c\u6587
+gb.newUser = \u5efa\u7acb\u4f7f\u7528\u8005
+gb.nextPull = next pull
+gb.nFederationProposalsToReview = \u7e3d\u5171\u6709{0}\u500b\u4e32\u9023\u8a08\u756b\u7b49\u5f85\u5be9\u8996
+gb.nMoreCommits = \u9084\u6709{0}\u4efd\u63d0\u4ea4 \u00bb
+gb.noActivity = \u904e\u53bb{0}\u5929\u4f86,\u4e26\u6c92\u6709\u6d3b\u52d5\u7d00\u9304
+gb.noActivityToday = \u4eca\u5929\u6c92\u6709\u6d3b\u52d5\u7d00\u9304
+gb.noComments = \u6c92\u6709\u5099\u8a3b
+gb.noDescriptionGiven = \u6c92\u6709\u7d66\u4e88\u7c21\u8ff0
+gb.noFederation = Sorry, {0} is not configured to federate with any Gitblit instances.
+gb.noForks = {0}\u6c92\u6709\u5206\u652f(fork)
+gb.noGitblitFound = Sorry, {0} could not find a Gitblit instance at {1}.
+gb.noHits = \u7121\u9ede\u64ca
+gb.noIndexedRepositoriesWarning = \u8ddf\u4f60\u76f8\u95dc\u7684\u6587\u4ef6\u5eab\u4e26\u6c92\u6709\u505aLucene\u7d22\u5f15
+gb.noMaximum = \u7121\u6700\u5927\u503c
+gb.noMilestoneSelected = \u672a\u9078\u53d6\u91cc\u7a0b\u7891
+gb.none = \u7121
+gb.nOpenTickets = {0}\u9805\u958b\u555f\u4e2d
+gb.noPermission = \u522a\u9664\u9019\u500b\u6b0a\u9650
+gb.noProposals = \u62b1\u6b49, {0}\u6b64\u6642\u4e26\u4e0d\u662f\u53ef\u63a5\u53d7\u7684\u8a08\u756b
+gb.noSelectedRepositoriesWarning = \u8acb\u81f3\u5c11\u9078\u64c7\u4e00\u500b\u6587\u4ef6\u5eab
+gb.notifyChangedOpenTickets = send notification for changed open tickets
+gb.notRestricted = \u533f\u540d\u72c0\u614b\u53ef\u4ee5View, Clone\u8207Push
+gb.notSpecified = \u7121\u6307\u5b9a
+gb.nParticipants = {0}\u500b\u53c3\u8207
+gb.nTotalTickets = \u7e3d\u5171{0}\u9805
+gb.object = \u7269\u4ef6
+gb.of = \u7684
+gb.ok = ok
+gb.oneAttachment = {0}\u500b\u9644\u4ef6
+gb.oneComment = {0}\u500b\u8a3b\u89e3
+gb.oneCommit = 1\u500b\u63d0\u4ea4
+gb.oneCommitTo = 1\u500b\u63d0\u4ea4\u5230
+gb.oneMoreCommit = \u9084\u6709\u4e00\u500b\u63d0\u4ea4 \u00bb
+gb.oneParticipant = {0}\u53c3\u8207
+gb.OneProposalToReview = \u6709\u4e00\u500b\u4e32\u9023\u7684\u63d0\u6848\u7b49\u5f85\u5be9\u67e5
+gb.opacityAdjust = Adjust opacity
+gb.open = \u958b\u555f
+gb.openMilestones = \u6253\u958b\u91cc\u7a0b\u7891
+gb.organization = \u7d44\u7e54
+gb.organizationalUnit = \u7d44\u7e54\u55ae\u4f4d
+gb.origin = origin
+gb.originDescription = \u6b64\u6587\u4ef6\u5eabURL\u5df2\u7d93\u88ab\u8907\u88fd(cloned)\u4e86
+gb.overdue = \u904e\u671f
+gb.overview = \u6982\u89c0
+gb.owned = \u64c1\u6709\u7684
+gb.owner = \u64c1\u6709\u8005
+gb.ownerDescription = \u64c1\u6709\u8005\u53ef\u4fee\u6539\u6587\u4ef6\u5eab\u8a2d\u5b9a\u503c
+gb.ownerPermission = \u6587\u4ef6\u5eab\u6240\u6709\u8005
+gb.owners = \u6240\u6709\u8005
+gb.ownersDescription = \u6240\u6709\u8005\u53ef\u4ee5\u7ba1\u7406\u6587\u4ef6\u5eab,\u4f46\u662f\u4e0d\u5141\u8a31\u4fee\u6539\u540d\u7a31(\u79c1\u4eba\u6587\u4ef6\u5eab\u4f8b\u5916)
+gb.pageFirst = \u7b2c\u4e00\u7b46
+gb.pageNext = \u4e0b\u4e00\u9801
+gb.pagePrevious = \u4e0a\u4e00\u9801
+gb.pages = \u9801\u9762
+gb.parent = \u4e0a\u500b\u7248\u672c
+gb.password = \u5bc6\u78bc
+gb.passwordChangeAborted = \u53d6\u6d88\u5bc6\u78bc\u8b8a\u66f4
+gb.passwordChanged = \u5bc6\u78bc\u8b8a\u66f4\u6210\u529f
+gb.passwordHint = \u5bc6\u78bc\u63d0\u793a
+gb.passwordHintRequired = \u5bc6\u78bc\u63d0\u793a(\u5fc5\u8981)
+gb.passwordsDoNotMatch = \u5bc6\u78bc\u4e0d\u76f8\u7b26
+gb.passwordTooShort = \u5bc6\u78bc\u904e\u77ed, \u6700\u5c11{0}\u500b\u5b57\u5143
+gb.patch = \u4fee\u88dc\u6a94
+gb.patchset = \u88dc\u4e01
+gb.patchsetAlreadyMerged = \u8a72\u88dc\u4e01\u5df2\u7d93\u5408\u4f75\u5230{0}
+gb.patchsetMergeable = \u8a72\u88dc\u4e01\u53ef\u4ee5\u81ea\u52d5\u8207{0}\u5408\u4f75
+gb.patchsetMergeableMore = \u4f7f\u7528\u547d\u4ee4\u529f\u80fd,\u8b93\u6b64\u88dc\u4e01\u53ef\u4ee5\u8207{0}\u5408\u4f75
+gb.patchsetN = \u88dc\u4e01{0}
+gb.patchsetNotApproved = \u8a72\u88dc\u4e01\u7248\u672c\u4e26\u6c92\u6709\u88ab\u6279\u51c6\u8207{0}\u5408\u4f75
+gb.patchsetNotApprovedMore = \u8a72\u88dc\u4e01\u5fc5\u9808\u7531\u5be9\u67e5\u8005\u6279\u51c6
+gb.patchsetNotMergeable = \u8a72\u88dc\u4e01\u4e0d\u80fd\u81ea\u52d5\u8207{0}\u5408\u4f75
+gb.patchsetNotMergeableMore = \u5fc5\u9808\u4ee5rebased\u6216\u662f\u624b\u52d5\u8207{0}\u5408\u4f75\u7684\u65b9\u5f0f\u624d\u80fd\u89e3\u6c7a\u8a72\u88dc\u4e01\u9020\u6210\u7684\u885d\u7a81
+gb.patchsetVetoedMore = \u5be9\u8996\u8005\u5df2\u7d93\u5c0d\u6b64\u88dc\u4e01\u6295\u7968
+gb.permission = \u6b0a\u9650
+gb.permissions = \u6b0a\u9650
+gb.permittedTeams = permitted teams
+gb.permittedUsers = permitted users
+gb.personalRepositories = \u500b\u4eba\u6587\u4ef6\u5eab
+gb.pleaseGenerateClientCertificate = \u8acb\u7522\u751f\u7d66{0}\u4f7f\u7528\u7684\u7528\u6236\u7aef\u8b49\u66f8
+gb.pleaseSelectGitIgnore = \u8acb\u9078\u64c7\u4e00\u500b.gitignore\u6a94\u6848
+gb.pleaseSelectProject = \u8acb\u9078\u64c7\u5c08\u6848!
+gb.pleaseSetDestinationUrl = Please enter a destination url for your proposal\!
+gb.pleaseSetGitblitUrl = \u8acb\u8f38\u5165Gitblit URL !
+gb.pleaseSetRepositoryName = \u8acb\u8a2d\u5b9a\u7248\u672c\u5eab\u540d\u7a31
+gb.pleaseSetTeamName = \u8acb\u8f38\u5165\u5718\u968a\u540d\u7a31
+gb.pleaseSetUsername = \u8acb\u8f38\u5165\u4f7f\u7528\u8005\u540d\u7a31
+gb.plugins = \u63d2\u4ef6
+gb.postReceiveDescription = \u63a5\u5230\u63d0\u4ea4\u7533\u8acb\u5f8c,<em>\u4e26\u4e14\u5728refs\u5b8c\u7562\u5f8c</em>, \u5c07\u6703\u57f7\u884cPost-receive hook..<p>This is the appropriate hook for notifications, build triggers, etc.</p>
+gb.postReceiveScripts = post-receive\u8173\u672c
+gb.preferences = \u9810\u8a2d\u5e38\u7528\u503c
+gb.preparingFork = \u6b63\u5728\u6e96\u5099\u8907\u88fd\u4e2d(fork)...
+gb.preReceiveDescription = \u63a5\u5230\u63d0\u4ea4\u7533\u8acb\u5f8c,<em>\u4f46\u5728\u9084\u6c92\u6709\u66f4\u65b0refs\u524d</em>, \u5c07\u6703\u57f7\u884cPre-receive hook. <p>This is the appropriate hook for rejecting a push.</p>
+gb.preReceiveScripts = pre-receive \u8173\u672c
+gb.preview = \u9810\u89bd
+gb.priority = \u512a\u5148
+gb.privilegeWithdrawn = privilege withdrawn
+gb.project = \u7fa4\u7d44
+gb.projects = \u7fa4\u7d44
+gb.properties = properties
+gb.proposal = proposal
+gb.proposalError = Sorry, {0} reports that an unexpected error occurred\!
+gb.proposalFailed = Sorry, {0} did not receive any proposal data\!
+gb.proposalReceived = Proposal successfully received by {0}.
+gb.proposals = \u8981\u6c42\u806f\u5408\u7684\u63d0\u6848
+gb.proposalTickets = \u63d0\u6848\u4fee\u6539
+gb.proposedThisChange = proposed this change
+gb.proposeInstructions = To start, craft a patchset and upload it with Git. Gitblit will link your patchset to this ticket by the id.
+gb.proposePatchset = propose a patchset
+gb.proposePatchsetNote = You are welcome to propose a patchset for this ticket.
+gb.proposeWith = propose a patchset with {0}
+gb.ptCheckout = Fetch & checkout the current patchset to a review branch
+gb.ptDescription = the Gitblit patchset tool
+gb.ptDescription1 = Barnum is a command-line companion for Git that simplifies the syntax for working with Gitblit Tickets and Patchsets.
+gb.ptDescription2 = Barnum requires Python 3 and native Git. It runs on Windows, Linux, and Mac OS X.
+gb.ptMerge = \u53d6\u5f97\u76ee\u524d\u88dc\u4e01,\u7136\u5f8c\u8207\u4f60\u672c\u6a5f\u7aef\u7684\u5206\u652f\u5408\u4f75
+gb.ptSimplifiedCollaboration = simplified collaboration syntax
+gb.ptSimplifiedMerge = simplified merge syntax
+gb.publicKey = \u516c\u958b\u91d1\u9470
+gb.pushedNCommitsTo = {0}\u500b\u63d0\u4ea4\u5df2\u63a8\u9001\u81f3
+gb.pushedNewBranch = \u65b0\u5206\u652f\u5df2\u63a8\u9001(pushed)
+gb.pushedNewTag = \u65b0\u6a19\u7c64\u5df2\u63a8\u9001(pushed)
+gb.pushedOneCommitTo = 1\u500b\u63d0\u4ea4\u5df2\u63a8\u9001\u81f3
+gb.pushPermission = {0}(\u63a8\u9001)
+gb.pushRestricted = authenticated push
+gb.queries = \u67e5\u8a62\u7d50\u679c
+gb.query = \u67e5\u8a62
+gb.queryHelp = \u652f\u63f4\u6a19\u6e96\u67e5\u8a62\u8a9e\u6cd5.<p/><p/>\u8a73\u60c5\u8acb\u53c3\u8003 <a target\ = "_new" href\ = "http\://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/queryparsersyntax.html">Lucene Query Parser Syntax</a>
+gb.queryResults = results {0} - {1} ({2} hits)
+gb.questionTickets = \u63d0\u554f
+gb.raw = \u539f\u6a23
+gb.reason = \u539f\u56e0
+gb.receive = \u63a5\u6536
+gb.received = \u5df2\u63a5\u6536
+gb.receiveSettings = \u8a2d\u5b9a\u63a5\u6536\u65b9\u5f0f
+gb.receiveSettingsDescription = \u63a7\u7ba1\u63a8\u9001\u5230\u6587\u4ef6\u5eab\u7684\u63a5\u6536\u65b9\u5f0f
+gb.recent = \u6700\u8fd1
+gb.recentActivity = \u6700\u8fd1\u6d3b\u8e8d\u72c0\u6cc1
+gb.recentActivityNone = \u904e\u53bb{0}\u5929/\u7121
+gb.recentActivityStats = \u904e\u53bb{0}\u5929,\u4e00\u5171\u6709{2}\u4eba\u57f7\u884c{1}\u4efd\u63d0\u4ea4
+gb.reflog = \u76f8\u95dc\u65e5\u8a8c
+gb.refresh = \u5237\u65b0
+gb.refs = \u5f15\u7528
+gb.regexPermission = \u5df2\u7d93\u4f7f\u7528\u6b63\u898f\u8868\u793a\u5f0f(regular expression)"{0}" \u8a2d\u5b9a\u6b0a\u9650\u5b8c\u7562
+gb.registration = \u8a3b\u518a
+gb.registrations = federation registrations
+gb.releaseDate = \u767c\u8868\u65e5
+gb.remote = \u9060\u7aef
+gb.removeVote = \u79fb\u9664\u6295\u7968
+gb.rename = \u6539\u540d\u7a31
+gb.repositories = \u6587\u4ef6\u5eab
+gb.repository = \u7248\u672c\u5eab
+gb.repositoryDeleted = \u7248\u672c\u5eab"{0}"\u5df2\u522a\u9664
+gb.repositoryDeleteFailed = \u522a\u9664\u7248\u672c\u5eab"{0}"\u5931\u6557!
+gb.repositoryDoesNotAcceptPatchsets = \u8a72\u7248\u672c\u5eab\u4e0d\u63a5\u53d7\u88dc\u4e01
+gb.repositoryForked = \u7248\u672c\u5eab{0}\u5df2\u7d93\u5efa\u7acb\u5206\u652f(fork)
+gb.repositoryForkFailed= \u5efa\u7acb\u5206\u652f(fork)\u5931\u6557
+gb.repositoryIsFrozen = \u8a72\u7248\u672c\u5eab\u5df2\u51cd\u7d50
+gb.repositoryIsMirror = \u8a72\u7248\u672c\u5eab\u70ba\u552f\u8b80\u8907\u672c
+gb.repositoryNotSpecified = \u672a\u6307\u5b9a\u7248\u672c\u5eab!
+gb.repositoryNotSpecifiedFor = \u7248\u672c\u5eab\u4e26\u6c92\u6709\u6307\u5b9a\u7d66 {0}\!
+gb.repositoryPermissions = \u7248\u672c\u5eab\u6b0a\u9650
+gb.repositoryUrl = \u7248\u672c\u5eab url
+gb.requestTickets = \u512a\u5316 & \u4efb\u52d9
+gb.requireApproval = \u9700\u6279\u51c6
+gb.requireApprovalDescription = \u5408\u4f75\u6309\u9215\u555f\u7528\u524d,\u88dc\u4e01\u5305\u5fc5\u9808\u5148\u6279\u51c6
+gb.reset = \u6e05\u9664
+gb.responsible = \u8ca0\u8cac\u4eba\u54e1
+gb.restrictedRepositories = restricted repositories
+gb.review = \u8907\u67e5(review)
+gb.reviewedPatchsetRev = reviewed patchset {0} revision {1}\: {2}
+gb.reviewers = \u5be9\u67e5\u8005
+gb.reviewPatchset = review {0} patchset {1}
+gb.reviews = reviews
+gb.revisionHistory = \u4fee\u6539\u7d00\u9304
+gb.revokeCertificate = \u64a4\u56de\u8b49\u66f8
+gb.revokeCertificateReason = \u8acb\u8f38\u5165\u64a4\u56de\u8b49\u66f8\u7406\u7531
+gb.revoked = \u5df2\u64a4\u92b7
+gb.rewind = REWIND
+gb.rewindPermission = {0} (push, ref creation+deletion+rewind)
+gb.save = \u5132\u5b58
+gb.search = \u641c\u5c0b
+gb.searchForAuthor = Search for commits authored by
+gb.searchForCommitter = Search for commits committed by
+gb.searchTickets = \u641c\u5c0b\u516c\u6587
+gb.searchTicketsTooltip = \u627e\u5230{0}\u4efd\u516c\u6587
+gb.searchTooltip = \u641c\u5c0b{0}
+gb.searchTypeTooltip = \u9078\u64c7\u641c\u5c0b\u985e\u578b
+gb.selectAccessRestriction = Please select access restriction\!
+gb.selected = \u9078\u5b9a
+gb.selectFederationStrategy = Please select federation strategy\!
+gb.sendEmail = \u767cemail
+gb.sendProposal = propose
+gb.serialNumber = \u5e8f\u865f
+gb.serveCertificate = \u555f\u7528\u4f7f\u7528\u6b64\u8b49\u66f8\u7684https\u529f\u80fd
+gb.serverDoesNotAcceptPatchsets = \u672c\u4f3a\u670d\u5668\u4e0d\u63a5\u53d7\u88dc\u4e01
+gb.servers = \u4f3a\u670d\u5668
+gb.servletContainer = servlet\u5bb9\u5668
+gb.sessionEnded = session\u5df2\u7d93\u53d6\u6d88
+gb.setDefault = \u8a2d\u70ba\u9810\u8a2d\u503c
+gb.settings = \u8a2d\u5b9a
+gb.severity = \u91cd\u8981
+gb.sha1FingerPrint = SHA-1 Fingerprint
+gb.show_whitespace = \u986f\u793a\u7a7a\u767d
+gb.showHideDetails = \u986f\u793a/\u96b1\u85cf \u8a73\u89e3\u5167\u5bb9
+gb.showReadme = \u986f\u793areadme\u6587\u4ef6
+gb.showReadmeDescription = \u5728\u532f\u7e3d\u9801\u9762\u4e2d\u986f\u793a"readme"(markdown\u683c\u5f0f)
+gb.showRemoteBranches = \u986f\u793a\u9060\u7aef\u5206\u652f
+gb.showRemoteBranchesDescription = \u986f\u793a\u9060\u7aef\u5206\u652f(branches)
+gb.signatureAlgorithm = \u7c3d\u7ae0\u6f14\u7b97\u6cd5
+gb.since = since
+gb.siteName = \u7ad9\u53f0\u540d\u7a31
+gb.siteNameDescription = \u4f3a\u670d\u5668\u7c21\u7a31
+gb.size = \u5bb9\u91cf
+gb.skipSizeCalculation = \u7565\u904e\u5bb9\u91cf\u8a08\u7b97
+gb.skipSizeCalculationDescription = \u4e0d\u8a08\u7b97\u6587\u4ef6\u5eab\u5bb9\u91cf(\u52a0\u5feb\u7db2\u9801\u8f09\u5165\u901f\u5ea6)
+gb.skipSummaryMetrics = \u7565\u904e\u91cf\u5316\u532f\u7e3d
+gb.skipSummaryMetricsDescription = \u4e0d\u8981\u8a08\u7b97\u91cf\u5316\u4e26\u4e14\u986f\u793a\u5728\u532f\u7e3d\u9801\u9762\u4e0a(\u52a0\u5feb\u901f\u5ea6)
+gb.sort = \u6392\u5e8f
+gb.sortHighestPriority = \u6700\u9ad8\u512a\u5148
+gb.sortHighestSeverity = \u6700\u91cd\u8981
+gb.sortLeastComments = \u6700\u5c11\u5099\u8a3b
+gb.sortLeastPatchsetRevisions = \u6700\u5c11\u88dc\u4e01\u4fee\u6539
+gb.sortLeastRecentlyUpdated = \u6700\u8fd1\u6700\u5c11\u8b8a\u52d5
+gb.sortLeastVotes = \u6700\u5c11\u6295\u7968
+gb.sortLowestPriority = \u6700\u4f4e\u512a\u5148
+gb.sortLowestSeverity = \u6700\u4e0d\u91cd\u8981
+gb.sortMostComments = \u6700\u591a\u5099\u8a3b
+gb.sortMostPatchsetRevisions = \u6700\u591a\u88dc\u4e01\u4fee\u6b63
+gb.sortMostRecentlyUpdated = \u6700\u8fd1\u66f4\u65b0
+gb.sortMostVotes = \u6700\u591a\u6295\u7968
+gb.sortNewest = \u6700\u65b0
+gb.sortOldest = \u6700\u820a
+gb.specified = \u6307\u5b9a\u7d66\u4e88(\u542b\u7cfb\u7d71\u9810\u8a2d)
+gb.sshKeyCommentDescription = \u8acb\u8f38\u5165\u5099\u8a3b, \u82e5\u7121\u5099\u8a3b, \u5c07\u81ea\u8a02\u586b\u5165key data
+gb.sshKeyPermissionDescription = \u6307\u5b9a\u8a72SSH key\u6240\u64c1\u6709\u7684\u5b58\u53d6\u6b0a\u9650
+gb.sshKeys = SSH Keys
+gb.sshKeysDescription = SSH \u516c\u958b\u91d1\u9470\u662f\u5bc6\u78bc\u8a8d\u8b49\u5916\u66f4\u5b89\u5168\u7684\u9078\u9805
+gb.sslCertificateGenerated = \u6210\u529f\u7522\u751f\u7d66{0}\u7684\u670d\u5668SSL\u8b49\u66f8
+gb.sslCertificateGeneratedRestart = \u6210\u529f\u7522\u751f\u7d66{0}\u4f7f\u7528\u7684SSL\u8b49\u66f8\n\u4f60\u5fc5\u9808\u91cd\u65b0\u555f\u52d5Gitblit\u7248\u63a7\u4f3a\u670d\u5668\u624d\u80fd\u555f\u7528\u65b0\u7684\u8b49\u66f8\n\nf you are launching with the '--alias' parameter you will have to set that to ''--alias {0}''.
+gb.star = \u91cd\u8981
+gb.stargazers = stargazers
+gb.starred = \u91cd\u8981
+gb.starredAndOwned = \u91cd\u8981\u7684 & \u64c1\u6709\u7684
+gb.starredRepositories = \u91cd\u8981\u7684\u6587\u4ef6\u5eab
+gb.starting = \u555f\u52d5\u4e2d
+gb.stateProvince = \u5dde\u6216\u7701
+gb.stats = \u7d71\u8a08
+gb.status = \u72c0\u614b
+gb.stepN = \u6b65\u9a5f{0}
+gb.stopWatching = \u505c\u6b62\u8ffd\u8e64(watching)
+gb.subject = \u6a19\u984c
+gb.subscribe = \u8a02\u95b1
+gb.summary = \u532f\u7e3d
+gb.superseded = \u5df2\u88ab\u66ff\u4ee3
+gb.tag = \u6a19\u7c64
+gb.tagger = tagger
+gb.tags = \u6a19\u7c64
+gb.taskTickets = \u4efb\u52d9
+gb.team = \u5718\u968a
+gb.teamCreated = \u5718\u968a"{0}"\u65b0\u589e\u6210\u529f.
+gb.teamMembers = \u5718\u968a\u6210\u54e1
+gb.teamMemberships = \u5718\u968a\u6210\u54e1(memberships)
+gb.teamMustSpecifyRepository = \u5718\u968a\u6700\u5c11\u8981\u6307\u5b9a\u4e00\u500b\u7248\u672c\u5eab
+gb.teamName = \u5718\u968a\u540d\u7a31
+gb.teamNameUnavailable = \u5718\u968a"{0}"\u4e0d\u5b58\u5728.
+gb.teamPermission = "{0}" \u5718\u968a\u6210\u54e1\u7684\u6b0a\u9650
+gb.teamPermissions = \u5718\u968a\u6b0a\u9650
+gb.teamPermissionsDescription = \u4f60\u53ef\u4ee5\u6307\u5b9a\u5718\u968a\u6b0a\u9650.\u9019\u4e9b\u8a2d\u5b9a\u5c07\u6703\u53d6\u4ee3\u539f\u672c\u5718\u968a\u9810\u8a2d\u6b0a\u9650
+gb.teams = \u53c3\u8207\u7684\u5718\u968a
+gb.ticket = \u516c\u6587
+gb.ticketAssigned = \u5df2\u6307\u5b9a
+gb.ticketComments = \u8a3b\u89e3
+gb.ticketId = \u516c\u6587ID
+gb.ticketIsClosed = \u8a72\u516c\u6587\u5df2\u7d93\u7d50\u6848
+gb.ticketN = \u516c\u6587\u5e8f\u865f{0}
+gb.ticketOpenDate = \u767c\u884c\u65e5
+gb.ticketPatchset = {0}\u516c\u6587,{1}\u88dc\u4e01
+gb.tickets = \u516c\u6587
+gb.ticketSettings = \u516c\u6587\u5167\u5bb9\u8a2d\u5b9a
+gb.ticketStatus = \u72c0\u614b
+gb.ticketsWelcome = \u4f60\u53ef\u4ee5\u5229\u7528\u516c\u6587\u7cfb\u7d71\u5efa\u69cb\u51fa\u5f85\u8fa6\u4e8b\u9805, \u81ed\u87f2\u56de\u5831\u5340\u4ee5\u53ca\u88dc\u4e01\u5305\u7684\u5354\u540c\u5408\u4f5c
+gb.time.daysAgo = {0}\u5929\u524d
+gb.time.hoursAgo = {0}\u5c0f\u6642\u524d
+gb.time.inDays = {0}\u5929\u5167
+gb.time.inHours = {0}\u5c0f\u6642\u5167
+gb.time.inMinutes = {0}\u5206\u9418\u5167
+gb.time.justNow = \u525b\u525b
+gb.time.minsAgo = {0}\u5206\u9418\u524d
+gb.time.monthsAgo = {0}\u6708\u524d
+gb.time.oneYearAgo = 1\u5e74\u524d
+gb.time.today = \u4eca\u5929
+gb.time.weeksAgo = {0}\u5468\u524d
+gb.time.yearsAgo = {0}\u5e74\u524d
+gb.time.yesterday = \u6628\u5929
+gb.title = \u6a19\u984c
+gb.to = to
+gb.toBranch = to {0}
+gb.todaysActivityNone = \u4eca\u5929/\u7121
+gb.todaysActivityStats = \u4eca\u5929/\u6709{2}\u500b\u4f5c\u8005\u5b8c\u6210{1}\u500b\u63d0\u4ea4
+gb.token = token
+gb.tokenAllDescription = \u6240\u6709\u6587\u4ef6\u5eab,\u4f7f\u7528\u8005\u8207\u8a2d\u5b9a
+gb.tokenJurDescription = \u6240\u6709\u6587\u4ef6\u5eab
+gb.tokens = federation tokens
+gb.tokenUnrDescription = \u6240\u6709\u6587\u4ef6\u5eab\u8207\u4f7f\u7528\u8005
+gb.topic = \u8a71\u984c
+gb.topicsAndLabels = \u8a71\u984c\u8207\u6a19\u8a18
+gb.transportPreference = \u9810\u8a2d\u901a\u8a0a\u5354\u5b9a
+gb.transportPreferenceDescription = \u8a2d\u5b9a\u4f60\u5e38\u7528\u7684\u9023\u7dda\u901a\u8a0a\u5354\u5b9a\u4ee5\u7528\u4f86\u8907\u88fd(clone)
+gb.tree = \u76ee\u9304
+gb.type = \u985e\u578b
+gb.unauthorizedAccessForRepository = \u7248\u672c\u5eab\u672a\u6388\u6b0a\u5b58\u53d6
+gb.undefinedQueryWarning = \u672a\u8a2d\u5b9a\u67e5\u8a62\u689d\u4ef6
+gb.unspecified = \u672a\u6307\u5b9a
+gb.unstar = \u53d6\u6d88
+gb.updated = \u5df2\u66f4\u65b0
+gb.updatedBy = updated by
+gb.uploadedPatchsetN = \u88dc\u4e01{0}\u5df2\u4e0a\u50b3
+gb.uploadedPatchsetNRevisionN = \u88dc\u4e01{0}\u4fee\u6539\u7248\u672c{1}\u5df2\u4e0a\u50b3
+gb.url = URL
+gb.useDocsDescription = \u8a08\u7b97\u6587\u4ef6\u5eab\u88e1\u9762\u7684Markdown\u6a94\u6848
+gb.useIncrementalPushTagsDescription = \u63a8\u9001\u6642\u5c07\u81ea\u52d5\u65b0\u589e\u6a19\u7c64\u865f\u78bc
+gb.userCreated = \u6210\u529f\u5efa\u7acb\u65b0\u4f7f\u7528\u8005"{0}"
+gb.userDeleted = \u4f7f\u7528\u8005"{0}"\u5df2\u522a\u9664
+gb.userDeleteFailed = \u4f7f\u7528\u8005"{0}"\u522a\u9664\u5931\u6557
+gb.username = \u4f7f\u7528\u8005\u540d\u7a31
+gb.usernameUnavailable = \u4f7f\u7528\u8005\u540d\u7a31"{0}"\u4e0d\u53ef\u7528
+gb.userPermissions = \u4f7f\u7528\u8005\u6b0a\u9650
+gb.userPermissionsDescription = \u4f60\u53ef\u4ee5\u91dd\u5c0d\u5e33\u865f\u8a2d\u5b9a\u6b0a\u9650(\u9019\u4e9b\u8a2d\u5b9a\u5c07\u8986\u84cb\u5718\u968a\u6216\u5176\u4ed6\u6b0a\u9650)
+gb.users = \u4f7f\u7528\u8005
+gb.userServiceDoesNotPermitAddUser = {0}\u4e0d\u5141\u8a31\u65b0\u589e\u4f7f\u7528\u8005\u5e33\u865f
+gb.userServiceDoesNotPermitPasswordChanges = {0}\u4e0d\u5141\u8a31\u4fee\u6539\u5bc6\u78bc
+gb.useTicketsDescription = readonly, distributed Ticgit issues
+gb.validFrom = valid from
+gb.validity = validity
+gb.validUntil = valid until
+gb.verifyCommitter = \u63d0\u4ea4\u8005\u9700\u9a57\u8b49
+gb.verifyCommitterDescription = \u9700\u8981\u63d0\u4ea4\u8005\u7b26\u5408\u63a8\u9001\u5e33\u865f
+gb.verifyCommitterNote = \u6240\u6709\u5408\u4f75\u52d5\u4f5c\u7686\u9808\u5f37\u5236\u4f7f\u7528"--no-ff"\u53c3\u6578
+gb.version = \u7248\u672c
+gb.veto = veto
+gb.view = \u6aa2\u8996
+gb.viewAccess = \u4f60\u6c92\u6709Gitblit\u8b80\u53d6\u6216\u662f\u4fee\u6539\u6b0a\u9650
+gb.viewCertificate = \u6aa2\u8996\u8b49\u66f8
+gb.viewComparison = \u6bd4\u8f03\u9019{0}\u500b\u63d0\u4ea4 \u00bb
+gb.viewPermission = {0} (\u6aa2\u8996)
+gb.viewPolicy = Restrict View, Clone, & Push
+gb.viewPolicyDescription = \u9078\u64c7\u53ef\u4ee5\u5728\u6587\u4ef6\u5eab\u6aa2\u8996,\u8907\u88fd(clone)\u8207\u63a8\u9001(push)\u7684\u4f7f\u7528\u8005, \u9664\u6b64\u4e4b\u5916\u5176\u4ed6\u4eba\u7686\u7121\u6b0a\u9650
+gb.viewRestricted = authenticated view, clone, & push
+gb.vote = \u5c0d{0}\u6295\u7968
+gb.voters = votes
+gb.votes = votes
+gb.warning = \u8b66\u544a
+gb.watch = \u76e3\u770b{0}
+gb.watchers = \u76e3\u770b\u8005
+gb.watching = \u76e3\u770b\u4e2d
+gb.workingCopy = \u5de5\u4f5c\u8907\u672c
+gb.workingCopyWarning = \u8a72\u6587\u4ef6\u5eab\u4ecd\u6709\u5de5\u4f5c\u8907\u672c,\u56e0\u6b64\u7121\u6cd5\u63a5\u53d7\u63a8\u9001(push)
+gb.write = write
+gb.youDoNotHaveClonePermission = \u4f60\u4e0d\u5141\u8a31\u8907\u88fd(clone)\u6b64\u6587\u4ef6\u5eab
+gb.yourAssignedTickets = \u6307\u6d3e\u7d66\u4f60\u7684
+gb.yourCreatedTickets = \u7531\u4f60\u65b0\u589e\u7684
+gb.yourWatchedTickets = \u4f60\u60f3\u770b\u7684
+gb.zip = zip\u58d3\u7e2e\u6a94
diff --git a/src/main/java/com/gitblit/wicket/pages/TicketPage.java b/src/main/java/com/gitblit/wicket/pages/TicketPage.java
index 2dbc8e9d..8bf5c6d9 100644
--- a/src/main/java/com/gitblit/wicket/pages/TicketPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/TicketPage.java
@@ -88,10 +88,10 @@ import com.gitblit.utils.TimeUtils;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.TicketsUI;
import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.panels.AvatarImage;
import com.gitblit.wicket.panels.BasePanel.JavascriptTextPrompt;
import com.gitblit.wicket.panels.CommentPanel;
import com.gitblit.wicket.panels.DiffStatPanel;
-import com.gitblit.wicket.panels.AvatarImage;
import com.gitblit.wicket.panels.IconAjaxLink;
import com.gitblit.wicket.panels.LinkPanel;
import com.gitblit.wicket.panels.ShockWaveComponent;
@@ -823,7 +823,7 @@ public class TicketPage extends RepositoryPage {
item.add(new LinkPanel("diff", "link", getString("gb.diff"), CommitDiffPage.class,
WicketUtils.newObjectParameter(repositoryName, commit.getName()), true));
item.add(new Label("title", StringUtils.trimString(commit.getShortMessage(), Constants.LEN_SHORTLOG_REFS)));
- item.add(WicketUtils.createDateLabel("commitDate", JGitUtils.getCommitDate(commit), GitBlitWebSession
+ item.add(WicketUtils.createDateLabel("commitDate", JGitUtils.getAuthorDate(commit), GitBlitWebSession
.get().getTimezone(), getTimeUtils(), false));
item.add(new DiffStatPanel("commitDiffStat", 0, 0, true));
}
diff --git a/src/main/java/com/gitblit/wicket/pages/UserPage.java b/src/main/java/com/gitblit/wicket/pages/UserPage.java
index 6e7e7a76..ea68f25b 100644
--- a/src/main/java/com/gitblit/wicket/pages/UserPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/UserPage.java
@@ -183,7 +183,8 @@ public class UserPage extends RootPage {
new Language("Norsk", "no"),
new Language("Język Polski", "pl"),
new Language("Português", "pt_BR"),
- new Language("中文", "zh_CN"));
+ new Language("簡體中文", "zh_CN"),
+ new Language("正體中文", "zh_TW"));
Locale locale = user.getPreferences().getLocale();
if (locale == null) {
diff --git a/src/main/java/com/gitblit/wicket/panels/HistoryPanel.java b/src/main/java/com/gitblit/wicket/panels/HistoryPanel.java
index 5233f7c9..a3f127b1 100644
--- a/src/main/java/com/gitblit/wicket/panels/HistoryPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/HistoryPanel.java
@@ -160,7 +160,7 @@ public class HistoryPanel extends BasePanel {
@Override
public void populateItem(final Item<RevCommit> item) {
final RevCommit entry = item.getModelObject();
- final Date date = JGitUtils.getCommitDate(entry);
+ final Date date = JGitUtils.getAuthorDate(entry);
item.add(WicketUtils.createDateLabel("commitDate", date, getTimeZone(), getTimeUtils()));
diff --git a/src/main/java/com/gitblit/wicket/panels/LogPanel.java b/src/main/java/com/gitblit/wicket/panels/LogPanel.java
index 16fc746e..e9d240d0 100644
--- a/src/main/java/com/gitblit/wicket/panels/LogPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/LogPanel.java
@@ -109,7 +109,7 @@ public class LogPanel extends BasePanel {
@Override
public void populateItem(final Item<RevCommit> item) {
final RevCommit entry = item.getModelObject();
- final Date date = JGitUtils.getCommitDate(entry);
+ final Date date = JGitUtils.getAuthorDate(entry);
final boolean isMerge = entry.getParentCount() > 1;
item.add(WicketUtils.createDateLabel("commitDate", date, getTimeZone(), getTimeUtils()));
diff --git a/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java b/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java
index 91ce9864..efcb1cb6 100644
--- a/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java
@@ -158,6 +158,7 @@ public class ProjectRepositoryPanel extends BasePanel {
add(new Label("repositorySize", localizer.getString("gb.empty", parent)).setEscapeModelStrings(false));
}
- add(new ExternalLink("syndication", SyndicationServlet.asLink("", entry.name, null, 0)));
+ add(new ExternalLink("syndication", SyndicationServlet.asLink(getRequest()
+ .getRelativePathPrefixToContextRoot(), entry.name, null, 0)));
}
}
diff --git a/src/main/java/com/gitblit/wicket/panels/SearchPanel.java b/src/main/java/com/gitblit/wicket/panels/SearchPanel.java
index 5d0b2de1..09322bc7 100644
--- a/src/main/java/com/gitblit/wicket/panels/SearchPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/SearchPanel.java
@@ -86,7 +86,7 @@ public class SearchPanel extends BasePanel {
@Override
public void populateItem(final Item<RevCommit> item) {
final RevCommit entry = item.getModelObject();
- final Date date = JGitUtils.getCommitDate(entry);
+ final Date date = JGitUtils.getAuthorDate(entry);
item.add(WicketUtils.createDateLabel("commitDate", date, getTimeZone(), getTimeUtils()));
diff --git a/src/main/java/login_zh_TW.mkd b/src/main/java/login_zh_TW.mkd
new file mode 100644
index 00000000..68cfedf4
--- /dev/null
+++ b/src/main/java/login_zh_TW.mkd
@@ -0,0 +1,3 @@
+## 請登入
+
+請輸入密碼,以便登入此Gitblit版控伺服器
diff --git a/src/main/java/welcome_zh_TW.mkd b/src/main/java/welcome_zh_TW.mkd
new file mode 100644
index 00000000..eaaee652
--- /dev/null
+++ b/src/main/java/welcome_zh_TW.mkd
@@ -0,0 +1,3 @@
+## 歡迎來到Gitblit版本控管伺服器
+
+一個快速讓您能存放自己Git文件庫的解決方案 [Git](http://www.git-scm.com)