Browse Source

Merge branch 'develop' into api/github-compliance

pull/3742/head
Kim "BKC" Carlbäcker 8 years ago committed by GitHub
parent
commit
5e2fff0f6f
  1. 4
      .gitattributes
  2. 63
      .gopmfile
  3. 7
      .pkgr.yml
  4. 1
      .travis.yml
  5. 22
      Dockerfile.aarch64
  6. 2
      Makefile
  7. 11
      README.md
  8. 3
      README_ZH.md
  9. 20
      appveyor.yml
  10. 82
      cmd/import.go
  11. 32
      cmd/web.go
  12. 53
      conf/app.ini
  13. 1
      conf/locale/TRANSLATORS
  14. 16
      conf/locale/locale_bg-BG.ini
  15. 214
      conf/locale/locale_cs-CZ.ini
  16. 42
      conf/locale/locale_de-DE.ini
  17. 18
      conf/locale/locale_en-US.ini
  18. 136
      conf/locale/locale_es-ES.ini
  19. 60
      conf/locale/locale_fi-FI.ini
  20. 44
      conf/locale/locale_fr-FR.ini
  21. 1210
      conf/locale/locale_gl-ES.ini
  22. 60
      conf/locale/locale_it-IT.ini
  23. 62
      conf/locale/locale_ja-JP.ini
  24. 1211
      conf/locale/locale_ko-KR.ini
  25. 164
      conf/locale/locale_lv-LV.ini
  26. 70
      conf/locale/locale_nl-NL.ini
  27. 190
      conf/locale/locale_pl-PL.ini
  28. 662
      conf/locale/locale_pt-BR.ini
  29. 100
      conf/locale/locale_ru-RU.ini
  30. 16
      conf/locale/locale_sr-SP.ini
  31. 1210
      conf/locale/locale_sv-SE.ini
  32. 28
      conf/locale/locale_tr-TR.ini
  33. 16
      conf/locale/locale_zh-CN.ini
  34. 16
      conf/locale/locale_zh-HK.ini
  35. 200
      conf/locale/locale_zh-TW.ini
  36. 66
      glide.lock
  37. 7
      gogs.go
  38. 2
      models/action.go
  39. 3
      models/admin.go
  40. 172
      models/issue.go
  41. 97
      models/issue_comment.go
  42. 23
      models/issue_label.go
  43. 78
      models/issue_mail.go
  44. 12
      models/login_source.go
  45. 8
      models/migrations/migrations.go
  46. 1
      models/models.go
  47. 19
      models/org.go
  48. 13
      models/org_team.go
  49. 76
      models/pull.go
  50. 9
      models/release.go
  51. 63
      models/repo.go
  52. 26
      models/repo_mirror.go
  53. 14
      models/ssh_key.go
  54. 9
      models/token.go
  55. 4
      models/update.go
  56. 41
      models/user.go
  57. 14
      models/user_mail.go
  58. 10
      models/webhook.go
  59. 9
      modules/auth/ldap/ldap.go
  60. 3
      modules/auth/repo_form.go
  61. 73
      modules/base/tool.go
  62. 1136
      modules/bindata/bindata.go
  63. 5
      modules/context/context.go
  64. 63
      modules/context/repo.go
  65. 90
      modules/mailer/mail.go
  66. 43
      modules/markdown/markdown.go
  67. 49
      modules/setting/setting.go
  68. 10
      modules/ssh/ssh.go
  69. 14
      modules/sync/status_pool.go
  70. 4
      modules/sync/unique_queue.go
  71. 4
      modules/template/highlight/highlight.go
  72. 8
      modules/template/template.go
  73. 16
      public/config.codekit
  74. 31
      public/css/gogs.css
  75. 11
      public/css/semantic-2.2.1.min.css
  76. 11
      public/css/semantic-2.2.7.min.css
  77. BIN
      public/css/themes/material/assets/fonts/icons.eot
  78. 2373
      public/css/themes/material/assets/fonts/icons.svg
  79. BIN
      public/css/themes/material/assets/fonts/icons.ttf
  80. BIN
      public/css/themes/material/assets/fonts/icons.woff
  81. 2
      public/js/gogs.js
  82. 19
      public/js/semantic-2.2.1.min.js
  83. 19
      public/js/semantic-2.2.7.min.js
  84. 1
      public/less/_form.less
  85. 8
      public/less/_repository.less
  86. 10
      public/less/_user.less
  87. 3
      routers/admin/admin.go
  88. 2
      routers/admin/auths.go
  89. 11
      routers/admin/users.go
  90. 9
      routers/api/v1/admin/user.go
  91. 8
      routers/api/v1/api.go
  92. 5
      routers/api/v1/repo/file.go
  93. 2
      routers/api/v1/repo/hook.go
  94. 47
      routers/api/v1/repo/issue_comment.go
  95. 2
      routers/api/v1/repo/issue_label.go
  96. 8
      routers/api/v1/repo/label.go
  97. 2
      routers/api/v1/repo/milestone.go
  98. 30
      routers/api/v1/repo/repo.go
  99. 1
      routers/api/v1/user/email.go
  100. 17
      routers/install.go
  101. Some files were not shown because too many files have changed in this diff Show More

4
.gitattributes vendored

@ -5,7 +5,7 @@ public/plugins/* linguist-vendored
public/plugins/* linguist-vendored public/plugins/* linguist-vendored
public/css/themes/* linguist-vendored public/css/themes/* linguist-vendored
public/css/github.min.css linguist-vendored public/css/github.min.css linguist-vendored
public/css/semantic-2.2.1.min.css linguist-vendored public/css/semantic-2.2.7.min.css linguist-vendored
public/js/libs/* linguist-vendored public/js/libs/* linguist-vendored
public/js/jquery-1.11.3.min.js linguist-vendored public/js/jquery-1.11.3.min.js linguist-vendored
public/js/semantic-2.2.1.min.js linguist-vendored public/js/semantic-2.2.7.min.js linguist-vendored

63
.gopmfile

@ -2,57 +2,58 @@
path = github.com/gogits/gogs path = github.com/gogits/gogs
[deps] [deps]
github.com/bradfitz/gomemcache = commit:fb1f79c github.com/bradfitz/gomemcache = commit:2fafb84
github.com/urfave/cli = commit:1efa31f github.com/urfave/cli = commit:47a988
github.com/go-macaron/binding = commit:9440f33 github.com/go-macaron/binding = commit:4892016
github.com/go-macaron/cache = commit:5617353 github.com/go-macaron/cache = commit:5617353
github.com/go-macaron/captcha = commit:8aa5919 github.com/go-macaron/captcha = commit:8aa5919
github.com/go-macaron/csrf = commit:6a9a7df github.com/go-macaron/csrf = commit:6a9a7df
github.com/go-macaron/gzip = commit:cad1c65 github.com/go-macaron/gzip = commit:cad1c65
github.com/go-macaron/i18n = commit:ef57533 github.com/go-macaron/i18n = commit:ef57533
github.com/go-macaron/inject = commit:c5ab7bf github.com/go-macaron/inject = commit:d8a0b86
github.com/go-macaron/session = commit:66031fc github.com/go-macaron/session = commit:66031fc
github.com/go-macaron/toolbox = commit:82b5115 github.com/go-macaron/toolbox = commit:82b5115
github.com/go-sql-driver/mysql = commit:0b58b37 github.com/go-sql-driver/mysql = commit:2e00b5c
github.com/go-xorm/core = commit:5bf745d github.com/go-xorm/builder = commit:867edcc
github.com/go-xorm/xorm = commit:c6c7056 github.com/go-xorm/core = commit:2fbe2c7
github.com/go-xorm/xorm = commit:445a934
github.com/gogits/chardet = commit:2404f77 github.com/gogits/chardet = commit:2404f77
github.com/gogits/cron = commit:7f3990a github.com/gogits/cron = commit:2fc07a4
github.com/gogits/git-module = commit:5e0c133 github.com/gogits/git-module = commit:172cbc2
github.com/gogits/go-gogs-client = commit:c52f7ee github.com/gogits/go-gogs-client = commit:98046bb
github.com/gogits/go-libravatar = commit:cd1abbd
github.com/issue9/identicon = commit:d36b545 github.com/issue9/identicon = commit:d36b545
github.com/jaytaylor/html2text = commit:52d9b78 github.com/jaytaylor/html2text = commit:d16d412
github.com/kardianos/minwinsvc = commit:cad6b2b github.com/kardianos/minwinsvc = commit:cad6b2b
github.com/klauspost/compress = commit:14eb9c4 github.com/klauspost/compress = commit:461e8fd
github.com/klauspost/cpuid = commit:09cded8 github.com/klauspost/cpuid = commit:09cded8
github.com/klauspost/crc32 = commit:19b0b33 github.com/klauspost/crc32 = commit:cb6bfca
github.com/lib/pq = commit:80f8150 github.com/lib/pq = commit:67c3f2a
github.com/mattn/go-sqlite3 = commit:e118d44 github.com/mattn/go-sqlite3 = commit:ce9149a
github.com/mcuadros/go-version = commit:d52711f github.com/mcuadros/go-version = commit:257f7b9
github.com/microcosm-cc/bluemonday = commit:9dc1992 github.com/microcosm-cc/bluemonday = commit:e797637
github.com/msteinert/pam = commit:02ccfbf github.com/msteinert/pam = commit:02ccfbf
github.com/nfnt/resize = commit:891127d github.com/nfnt/resize = commit:891127d
github.com/russross/blackfriday = commit:93622da github.com/russross/blackfriday = commit:5f33e7b
github.com/satori/go.uuid = commit:0aa62d5 github.com/satori/go.uuid = commit:b061729
github.com/sergi/go-diff = commit:ec7fdbb github.com/sergi/go-diff = commit:24e2351
github.com/strk/go-libravatar = commit:5eed7bf github.com/shurcooL/sanitized_anchor_name = commit:1dba4b3
github.com/shurcooL/sanitized_anchor_name = commit:10ef21a github.com/Unknwon/cae = commit:c6aac99
github.com/Unknwon/cae = commit:7f5e046
github.com/Unknwon/com = commit:28b053d github.com/Unknwon/com = commit:28b053d
github.com/Unknwon/i18n = commit:39d6f27 github.com/Unknwon/i18n = commit:39d6f27
github.com/Unknwon/paginater = commit:7748a72 github.com/Unknwon/paginater = commit:701c23f
golang.org/x/crypto = commit:bc89c49 golang.org/x/crypto = commit:dc137be
golang.org/x/net = commit:57bfaa8 golang.org/x/net = commit:f249948
golang.org/x/sys = commit:a646d33 golang.org/x/sys = commit:d75a526
golang.org/x/text = commit:2910a50 golang.org/x/text = commit:ece019d
gopkg.in/alexcesaro/quotedprintable.v3 = commit:2caba25 gopkg.in/alexcesaro/quotedprintable.v3 = commit:2caba25
gopkg.in/asn1-ber.v1 = commit:4e86f43 gopkg.in/asn1-ber.v1 = commit:4e86f43
gopkg.in/bufio.v1 = commit:567b2bf gopkg.in/bufio.v1 = commit:567b2bf
gopkg.in/editorconfig/editorconfig-core-go.v1 = commit:a872f05 gopkg.in/editorconfig/editorconfig-core-go.v1 = commit:a872f05
gopkg.in/gomail.v2 = commit:81ebce5 gopkg.in/gomail.v2 = commit:81ebce5
gopkg.in/ini.v1 = commit:cf53f92 gopkg.in/ini.v1 = commit:e3c2d47
gopkg.in/ldap.v2 = commit:d0a5ced gopkg.in/ldap.v2 = commit:8168ee0
gopkg.in/macaron.v1 = commit:7564489 gopkg.in/macaron.v1 = commit:78521e4
gopkg.in/redis.v2 = commit:e617904 gopkg.in/redis.v2 = commit:e617904
[res] [res]

7
.pkgr.yml

@ -7,10 +7,15 @@ targets:
- git - git
debian-8: debian-8:
<<: *debian <<: *debian
ubuntu-12.04:
<<: *debian
ubuntu-14.04: ubuntu-14.04:
<<: *debian <<: *debian
ubuntu-12.04: ubuntu-16.04:
<<: *debian <<: *debian
build_dependencies:
- bzr
- mercurial
centos-6: &el centos-6: &el
build_dependencies: build_dependencies:
- pam-devel - pam-devel

1
.travis.yml

@ -1,7 +1,6 @@
language: go language: go
go: go:
- 1.4
- 1.5 - 1.5
- 1.6 - 1.6
- 1.7 - 1.7

22
Dockerfile.aarch64

@ -0,0 +1,22 @@
FROM aarch64/alpine:3.5
MAINTAINER atzoum@gmail.com
# Install system utils & Gogs runtime dependencies
ADD https://github.com/tianon/gosu/releases/download/1.9/gosu-arm64 /usr/sbin/gosu
RUN chmod +x /usr/sbin/gosu \
&& apk --no-cache --no-progress add ca-certificates bash git linux-pam s6 curl openssh socat tzdata
ENV GOGS_CUSTOM /data/gogs
COPY . /app/gogs/
WORKDIR /app/gogs/
RUN ./docker/build.sh
# Configure LibC Name Service
COPY docker/nsswitch.conf /etc/nsswitch.conf
# Configure Docker Container
VOLUME ["/data"]
EXPOSE 22 3000
ENTRYPOINT ["docker/start.sh"]
CMD ["/bin/s6-svscan", "/app/gogs/docker/s6/"]

2
Makefile

@ -5,6 +5,8 @@ DATA_FILES := $(shell find conf | sed 's/ /\\ /g')
LESS_FILES := $(wildcard public/less/gogs.less public/less/_*.less) LESS_FILES := $(wildcard public/less/gogs.less public/less/_*.less)
GENERATED := modules/bindata/bindata.go public/css/gogs.css GENERATED := modules/bindata/bindata.go public/css/gogs.css
OS := $(shell uname)
TAGS = "" TAGS = ""
BUILD_FLAGS = "-v" BUILD_FLAGS = "-v"

11
README.md

@ -1,9 +1,9 @@
Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?branch=master)](https://travis-ci.org/gogits/gogs) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/gogs/localized.svg)](https://crowdin.com/project/gogs) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gogits/gogs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) Gogs - Go Git Service [![Build Status](https://travis-ci.org/gogits/gogs.svg?branch=master)](https://travis-ci.org/gogits/gogs) [![Build status](https://ci.appveyor.com/api/projects/status/b9uu5ejl933e2wlt/branch/master?svg=true)](https://ci.appveyor.com/project/Unknwon/gogs/branch/master) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/gogs/localized.svg)](https://crowdin.com/project/gogs) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gogits/gogs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
===================== =====================
![](https://github.com/gogits/gogs/blob/master/public/img/gogs-large-resize.png?raw=true) ![](https://github.com/gogits/gogs/blob/master/public/img/gogs-large-resize.png?raw=true)
##### Current tip version: 0.9.99 (see [Releases](https://github.com/gogits/gogs/releases) for binary versions or submit a task on [alpha stage automated binary building system](https://build.gogs.io/)) ##### Current tip version: [`.VERSION`](templates/.VERSION) (see [Releases](https://github.com/gogits/gogs/releases) for binary versions ~~or submit a task on [alpha stage automated binary building system](https://build.gogs.io/)~~)
| Web | UI | Preview | | Web | UI | Preview |
|:-------------:|:-------:|:-------:| |:-------------:|:-------:|:-------:|
@ -29,7 +29,6 @@ The goal of this project is to make the easiest, fastest, and most painless way
## Overview ## Overview
- Please see the [Documentation](https://gogs.io/docs/intro) for common usages and change log. - Please see the [Documentation](https://gogs.io/docs/intro) for common usages and change log.
- See the [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) to follow the develop team.
- Want to try it before doing anything else? Do it [online](https://try.gogs.io/gogs/gogs)! - Want to try it before doing anything else? Do it [online](https://try.gogs.io/gogs/gogs)!
- Having trouble? Get help with [Troubleshooting](https://gogs.io/docs/intro/troubleshooting.html) or [User Forum](https://discuss.gogs.io/). - Having trouble? Get help with [Troubleshooting](https://gogs.io/docs/intro/troubleshooting.html) or [User Forum](https://discuss.gogs.io/).
- Want to help with localization? Check out the [guide](https://gogs.io/docs/features/i18n.html)! - Want to help with localization? Check out the [guide](https://gogs.io/docs/features/i18n.html)!
@ -51,7 +50,7 @@ The goal of this project is to make the easiest, fastest, and most painless way
- Mail service - Mail service
- Administration panel - Administration panel
- Supports MySQL, PostgreSQL, SQLite3 and [TiDB](https://github.com/pingcap/tidb) (experimental) - Supports MySQL, PostgreSQL, SQLite3 and [TiDB](https://github.com/pingcap/tidb) (experimental)
- Multi-language support ([19 languages](https://crowdin.com/project/gogs)) - Multi-language support ([22 languages](https://crowdin.com/project/gogs))
## System Requirements ## System Requirements
@ -61,7 +60,7 @@ The goal of this project is to make the easiest, fastest, and most painless way
## Browser Support ## Browser Support
- Please see [Semantic UI](https://github.com/Semantic-Org/Semantic-UI#browser-support) for specific versions of supported browsers. - Please see [Semantic UI](https://github.com/Semantic-Org/Semantic-UI#browser-support) for specific versions of supported browsers.
- The official support minimal size is **1024*768**, UI may still looks right in smaller size but no promises and fixes. - The smallest resolution officially supported is **1024*768**, however the UI may still look right in smaller resolutions, but no promises or fixes.
## Installation ## Installation
@ -100,7 +99,7 @@ There are 5 ways to install Gogs:
- [Portal](https://portaldemo.xyz/cloud/) - [Portal](https://portaldemo.xyz/cloud/)
- [Sandstorm](https://github.com/cem/gogs-sandstorm) - [Sandstorm](https://github.com/cem/gogs-sandstorm)
- [sloppy.io](https://github.com/sloppyio/quickstarters/tree/master/gogs) - [sloppy.io](https://github.com/sloppyio/quickstarters/tree/master/gogs)
- [YunoHost](https://github.com/mbugeia/gogs_ynh) - [YunoHost](https://github.com/YunoHost-Apps/gogs_ynh)
- [DPlatform](https://github.com/j8r/DPlatform) - [DPlatform](https://github.com/j8r/DPlatform)
## Software and Service Support ## Software and Service Support

3
README_ZH.md

@ -10,7 +10,6 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
## 项目概览 ## 项目概览
- 有关基本用法和变更日志,请通过 [使用手册](https://gogs.io/docs/intro/) 查看。 - 有关基本用法和变更日志,请通过 [使用手册](https://gogs.io/docs/intro/) 查看。
- 您可以到 [Trello Board](https://trello.com/b/uxAoeLUl/gogs-go-git-service) 跟随开发团队的脚步。
- 想要先睹为快?直接去 [在线体验](https://try.gogs.io/gogs/gogs) 。 - 想要先睹为快?直接去 [在线体验](https://try.gogs.io/gogs/gogs) 。
- 使用过程中遇到问题?尝试从 [故障排查](https://gogs.io/docs/intro/troubleshooting.html) 页面或 [用户论坛](https://discuss.gogs.io/) 获取帮助。 - 使用过程中遇到问题?尝试从 [故障排查](https://gogs.io/docs/intro/troubleshooting.html) 页面或 [用户论坛](https://discuss.gogs.io/) 获取帮助。
- 希望帮助多国语言界面的翻译吗?请立即访问 [详情页面](https://gogs.io/docs/features/i18n.html)! - 希望帮助多国语言界面的翻译吗?请立即访问 [详情页面](https://gogs.io/docs/features/i18n.html)!
@ -32,7 +31,7 @@ Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自
- 支持邮件服务 - 支持邮件服务
- 支持后台管理面板 - 支持后台管理面板
- 支持 MySQL、PostgreSQL、SQLite3 和 [TiDB](https://github.com/pingcap/tidb)(实验性支持) 数据库 - 支持 MySQL、PostgreSQL、SQLite3 和 [TiDB](https://github.com/pingcap/tidb)(实验性支持) 数据库
- 支持多语言本地化([19 种语言]([more](https://crowdin.com/project/gogs))) - 支持多语言本地化([22 种语言]([more](https://crowdin.com/project/gogs)))
## 系统要求 ## 系统要求

20
appveyor.yml

@ -0,0 +1,20 @@
version: "{build}"
skip_tags: true
clone_folder: c:\gopath\src\github.com\gogits\gogs
clone_depth: 1
environment:
GOPATH: c:\gopath
GOVERSION: 1.7
build: false
deploy: false
install:
- go get -t -v ./...
notifications:
- provider: Email
to:
- u@gogs.io
on_build_success: false

82
cmd/import.go

@ -0,0 +1,82 @@
// Copyright 2016 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package cmd
import (
"fmt"
"os"
"path/filepath"
"time"
"github.com/Unknwon/com"
"github.com/urfave/cli"
"github.com/gogits/gogs/modules/setting"
)
var (
CmdImport = cli.Command{
Name: "import",
Usage: "Import portable data as local Gogs data",
Description: `Allow user import data from other Gogs installations to local instance
without manually hacking the data files`,
Subcommands: []cli.Command{
subcmdImportLocale,
},
}
subcmdImportLocale = cli.Command{
Name: "locale",
Usage: "Import locale files to local repository",
Action: runImportLocale,
Flags: []cli.Flag{
stringFlag("source", "", "Source directory that stores new locale files"),
stringFlag("target", "", "Target directory that stores old locale files"),
stringFlag("config, c", "custom/conf/app.ini", "Custom configuration file path"),
},
}
)
func runImportLocale(c *cli.Context) error {
if !c.IsSet("source") {
return fmt.Errorf("Source directory is not specified")
} else if !c.IsSet("target") {
return fmt.Errorf("Target directory is not specified")
}
if !com.IsDir(c.String("source")) {
return fmt.Errorf("Source directory does not exist or is not a directory")
} else if !com.IsDir(c.String("target")) {
return fmt.Errorf("Target directory does not exist or is not a directory")
}
if c.IsSet("config") {
setting.CustomConf = c.String("config")
}
setting.NewContext()
now := time.Now()
// Cut out en-US.
for _, lang := range setting.Langs[1:] {
name := fmt.Sprintf("locale_%s.ini", lang)
source := filepath.Join(c.String("source"), name)
target := filepath.Join(c.String("target"), name)
if !com.IsFile(source) {
continue
}
if err := com.Copy(source, target); err != nil {
return fmt.Errorf("Copy file: %v", err)
}
// Modification time of files from Crowdin often ahead of current,
// so we need to set back to current.
os.Chtimes(target, now, now)
}
fmt.Println("Locale files has been successfully imported!")
return nil
}

32
cmd/web.go

@ -37,6 +37,7 @@ import (
"github.com/gogits/gogs/modules/bindata" "github.com/gogits/gogs/modules/bindata"
"github.com/gogits/gogs/modules/context" "github.com/gogits/gogs/modules/context"
"github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/mailer"
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
"github.com/gogits/gogs/modules/template" "github.com/gogits/gogs/modules/template"
"github.com/gogits/gogs/routers" "github.com/gogits/gogs/routers"
@ -84,7 +85,7 @@ func checkVersion() {
// Check dependency version. // Check dependency version.
checkers := []VerChecker{ checkers := []VerChecker{
{"github.com/go-xorm/xorm", func() string { return xorm.Version }, "0.5.5"}, {"github.com/go-xorm/xorm", func() string { return xorm.Version }, "0.6.0"},
{"github.com/go-macaron/binding", binding.Version, "0.3.2"}, {"github.com/go-macaron/binding", binding.Version, "0.3.2"},
{"github.com/go-macaron/cache", cache.Version, "0.1.2"}, {"github.com/go-macaron/cache", cache.Version, "0.1.2"},
{"github.com/go-macaron/csrf", csrf.Version, "0.1.0"}, {"github.com/go-macaron/csrf", csrf.Version, "0.1.0"},
@ -93,7 +94,7 @@ func checkVersion() {
{"github.com/go-macaron/toolbox", toolbox.Version, "0.1.0"}, {"github.com/go-macaron/toolbox", toolbox.Version, "0.1.0"},
{"gopkg.in/ini.v1", ini.Version, "1.8.4"}, {"gopkg.in/ini.v1", ini.Version, "1.8.4"},
{"gopkg.in/macaron.v1", macaron.Version, "1.1.7"}, {"gopkg.in/macaron.v1", macaron.Version, "1.1.7"},
{"github.com/gogits/git-module", git.Version, "0.4.1"}, {"github.com/gogits/git-module", git.Version, "0.4.6"},
{"github.com/gogits/go-gogs-client", gogs.Version, "0.12.1"}, {"github.com/gogits/go-gogs-client", gogs.Version, "0.12.1"},
} }
for _, c := range checkers { for _, c := range checkers {
@ -116,7 +117,7 @@ func newMacaron() *macaron.Macaron {
if setting.EnableGzip { if setting.EnableGzip {
m.Use(gzip.Gziper()) m.Use(gzip.Gziper())
} }
if setting.Protocol == setting.FCGI { if setting.Protocol == setting.SCHEME_FCGI {
m.SetURLPrefix(setting.AppSubUrl) m.SetURLPrefix(setting.AppSubUrl)
} }
m.Use(macaron.Static( m.Use(macaron.Static(
@ -140,7 +141,7 @@ func newMacaron() *macaron.Macaron {
Funcs: funcMap, Funcs: funcMap,
IndentJSON: macaron.Env != macaron.PROD, IndentJSON: macaron.Env != macaron.PROD,
})) }))
models.InitMailRender(path.Join(setting.StaticRootPath, "templates/mail"), mailer.InitMailRender(path.Join(setting.StaticRootPath, "templates/mail"),
path.Join(setting.CustomPath, "templates/mail"), funcMap) path.Join(setting.CustomPath, "templates/mail"), funcMap)
localeNames, err := bindata.AssetDir("conf/locale") localeNames, err := bindata.AssetDir("conf/locale")
@ -247,6 +248,12 @@ func runWeb(ctx *cli.Context) error {
m.Combo("/applications").Get(user.SettingsApplications). m.Combo("/applications").Get(user.SettingsApplications).
Post(bindIgnErr(auth.NewAccessTokenForm{}), user.SettingsApplicationsPost) Post(bindIgnErr(auth.NewAccessTokenForm{}), user.SettingsApplicationsPost)
m.Post("/applications/delete", user.SettingsDeleteApplication) m.Post("/applications/delete", user.SettingsDeleteApplication)
m.Group("/organizations", func() {
m.Get("", user.SettingsOrganizations)
m.Post("/leave", user.SettingsLeaveOrganization)
})
m.Route("/delete", "GET,POST", user.SettingsDelete) m.Route("/delete", "GET,POST", user.SettingsDelete)
}, reqSignIn, func(ctx *context.Context) { }, reqSignIn, func(ctx *context.Context) {
ctx.Data["PageIsUserSettings"] = true ctx.Data["PageIsUserSettings"] = true
@ -559,6 +566,7 @@ func runWeb(ctx *cli.Context) error {
}, context.RepoRef()) }, context.RepoRef())
// m.Get("/branches", repo.Branches) // m.Get("/branches", repo.Branches)
m.Post("/branches/:name/delete", reqSignIn, reqRepoWriter, repo.DeleteBranchPost)
m.Group("/wiki", func() { m.Group("/wiki", func() {
m.Get("/?:page", repo.Wiki) m.Get("/?:page", repo.Wiki)
@ -585,12 +593,12 @@ func runWeb(ctx *cli.Context) error {
m.Get("/src/*", repo.Home) m.Get("/src/*", repo.Home)
m.Get("/raw/*", repo.SingleDownload) m.Get("/raw/*", repo.SingleDownload)
m.Get("/commits/*", repo.RefCommits) m.Get("/commits/*", repo.RefCommits)
m.Get("/commit/:sha([a-z0-9]{7,40})$", repo.Diff) m.Get("/commit/:sha([a-f0-9]{7,40})$", repo.Diff)
m.Get("/forks", repo.Forks) m.Get("/forks", repo.Forks)
}, context.RepoRef()) }, context.RepoRef())
m.Get("/commit/:sha([a-z0-9]{7,40})\\.:ext(patch|diff)", repo.RawDiff) m.Get("/commit/:sha([a-f0-9]{7,40})\\.:ext(patch|diff)", repo.RawDiff)
m.Get("/compare/:before([a-z0-9]{7,40})\\.\\.\\.:after([a-z0-9]{7,40})", repo.CompareDiff) m.Get("/compare/:before([a-z0-9]{40})\\.\\.\\.:after([a-z0-9]{40})", repo.CompareDiff)
}, ignSignIn, context.RepoAssignment(), repo.MustBeNotBare) }, ignSignIn, context.RepoAssignment(), repo.MustBeNotBare)
m.Group("/:username/:reponame", func() { m.Group("/:username/:reponame", func() {
m.Get("/stars", repo.Stars) m.Get("/stars", repo.Stars)
@ -633,7 +641,7 @@ func runWeb(ctx *cli.Context) error {
} }
var listenAddr string var listenAddr string
if setting.Protocol == setting.UNIX_SOCKET { if setting.Protocol == setting.SCHEME_UNIX_SOCKET {
listenAddr = fmt.Sprintf("%s", setting.HTTPAddr) listenAddr = fmt.Sprintf("%s", setting.HTTPAddr)
} else { } else {
listenAddr = fmt.Sprintf("%s:%s", setting.HTTPAddr, setting.HTTPPort) listenAddr = fmt.Sprintf("%s:%s", setting.HTTPAddr, setting.HTTPPort)
@ -642,14 +650,14 @@ func runWeb(ctx *cli.Context) error {
var err error var err error
switch setting.Protocol { switch setting.Protocol {
case setting.HTTP: case setting.SCHEME_HTTP:
err = http.ListenAndServe(listenAddr, m) err = http.ListenAndServe(listenAddr, m)
case setting.HTTPS: case setting.SCHEME_HTTPS:
server := &http.Server{Addr: listenAddr, TLSConfig: &tls.Config{MinVersion: tls.VersionTLS10}, Handler: m} server := &http.Server{Addr: listenAddr, TLSConfig: &tls.Config{MinVersion: tls.VersionTLS10}, Handler: m}
err = server.ListenAndServeTLS(setting.CertFile, setting.KeyFile) err = server.ListenAndServeTLS(setting.CertFile, setting.KeyFile)
case setting.FCGI: case setting.SCHEME_FCGI:
err = fcgi.Serve(nil, m) err = fcgi.Serve(nil, m)
case setting.UNIX_SOCKET: case setting.SCHEME_UNIX_SOCKET:
os.Remove(listenAddr) os.Remove(listenAddr)
var listener *net.UnixListener var listener *net.UnixListener

53
conf/app.ini

@ -1,17 +1,20 @@
# NEVER EVER MODIFY THIS FILE # !!! NEVER EVER MODIFY THIS FILE !!!
# PLEASE MAKE CHANGES ON CORRESPONDING CUSTOM CONFIG FILE # !!! PLEASE MAKE CHANGES ON CORRESPONDING CUSTOM CONFIG FILE !!!
# !!! IF YOU ARE PACKAGING PROVIDER, PLEASE MAKE OWN COPY OF IT !!!
; App name that shows on every page title ; App name that shows on every page title
APP_NAME = Gogs: Go Git Service APP_NAME = Gogs: Go Git Service
; Change it if you run locally ; The name of the system user that runs Gogs
RUN_USER = git RUN_USER = git
; Either "dev", "prod" or "test", default is "dev" ; Either "dev", "prod" or "test"
RUN_MODE = dev RUN_MODE = dev
[repository] [repository]
; Root path for storing repositories's data, default is "~/<username>/gogs-repositories"
ROOT = ROOT =
; The script type server supports, sometimes could be "sh"
SCRIPT_TYPE = bash SCRIPT_TYPE = bash
; Default ANSI charset ; Default ANSI charset for an unrecognized charset
ANSI_CHARSET = ANSI_CHARSET =
; Force every new repository to be private ; Force every new repository to be private
FORCE_PRIVATE = false FORCE_PRIVATE = false
@ -21,28 +24,32 @@ MAX_CREATION_LIMIT = -1
MIRROR_QUEUE_LENGTH = 1000 MIRROR_QUEUE_LENGTH = 1000
; Patch test queue length, increase if pull request patch testing starts hanging ; Patch test queue length, increase if pull request patch testing starts hanging
PULL_REQUEST_QUEUE_LENGTH = 1000 PULL_REQUEST_QUEUE_LENGTH = 1000
; Preferred Licenses to place at the top of the List ; Preferred Licenses to place at the top of the list
; Name must match file name in conf/license or custom/conf/license ; Name must match file name in conf/license or custom/conf/license
PREFERRED_LICENSES = Apache License 2.0,MIT License PREFERRED_LICENSES = Apache License 2.0,MIT License
; Disable ability to interact with repositories by HTTP protocol
DISABLE_HTTP_GIT = false
; Enable ability to migrate repository by local path
ENABLE_LOCAL_PATH_MIGRATION = false
[repository.editor] [repository.editor]
; List of file extensions that should have line wraps in the CodeMirror editor ; List of file extensions that should have line wraps in the CodeMirror editor.
; Separate extensions with a comma. To line wrap files w/o extension, just put a comma ; Separate extensions with a comma. To line wrap files without extension, just put a comma
LINE_WRAP_EXTENSIONS = .txt,.md,.markdown,.mdown,.mkd, LINE_WRAP_EXTENSIONS = .txt,.md,.markdown,.mdown,.mkd,
; Valid file modes that have a preview API associated with them, such as api/v1/markdown ; Valid file modes that have a preview API associated with them, such as api/v1/markdown.
; Separate values by commas. Preview tab in edit mode won't show if the file extension doesn't match ; Separate values by commas. Preview tab in edit mode won't show if the file extension doesn't match
PREVIEWABLE_FILE_MODES = markdown PREVIEWABLE_FILE_MODES = markdown
[repository.upload] [repository.upload]
; Whether repository file uploads are enabled. Defaults to `true` ; Enable repository file uploads.
ENABLED = true ENABLED = true
; Path for uploads. Defaults to `data/tmp/uploads` (tmp gets deleted on gogs restart) ; Path to temporarily store uploads (default path gets cleaned by Gogs in every start)
TEMP_PATH = data/tmp/uploads TEMP_PATH = data/tmp/uploads
; One or more allowed types, e.g. image/jpeg|image/png. Nothing means any file type ; File types that are allowed to be uploaded, e.g. image/jpeg|image/png. Leave empty means allow any file type
ALLOWED_TYPES = ALLOWED_TYPES =
; Max size of each file in MB. Defaults to 3MB ; Maximum size of each file in MB
FILE_MAX_SIZE = 3 FILE_MAX_SIZE = 3
; Max number of files per upload. Defaults to 5 ; Maximum number of files per upload
MAX_FILES = 5 MAX_FILES = 5
[ui] [ui]
@ -101,6 +108,8 @@ DISABLE_SSH = false
START_SSH_SERVER = false START_SSH_SERVER = false
; Domain name to be exposed in clone URL ; Domain name to be exposed in clone URL
SSH_DOMAIN = %(DOMAIN)s SSH_DOMAIN = %(DOMAIN)s
; Network interface builtin SSH server listens on
SSH_LISTEN_HOST = 0.0.0.0
; Port number to be exposed in clone URL ; Port number to be exposed in clone URL
SSH_PORT = 22 SSH_PORT = 22
; Port number builtin SSH server listens on ; Port number builtin SSH server listens on
@ -136,6 +145,10 @@ ENABLE_GZIP = false
; Landing page for non-logged users, can be "home" or "explore" ; Landing page for non-logged users, can be "home" or "explore"
LANDING_PAGE = home LANDING_PAGE = home
[http]
; Value for Access-Control-Allow-Origin header, default is not to present
ACCESS_CONTROL_ALLOW_ORIGIN =
; Define allowed algorithms and their minimum key length (use -1 to disable a type) ; Define allowed algorithms and their minimum key length (use -1 to disable a type)
[ssh.minimum_key_sizes] [ssh.minimum_key_sizes]
ED25519 = 256 ED25519 = 256
@ -264,7 +277,7 @@ DISABLE_GRAVATAR = false
; Federated avatar lookup uses DNS to discover avatar associated ; Federated avatar lookup uses DNS to discover avatar associated
; with emails, see https://www.libravatar.org ; with emails, see https://www.libravatar.org
; This value will be forced to be false in offline mode or Gravatar is disbaled. ; This value will be forced to be false in offline mode or Gravatar is disbaled.
ENABLE_FEDERATED_AVATAR = false ENABLE_FEDERATED_AVATAR = true
[attachment] [attachment]
; Whether attachments are enabled. Defaults to `true` ; Whether attachments are enabled. Defaults to `true`
@ -334,7 +347,7 @@ HOST =
; Mailer user name and password ; Mailer user name and password
USER = USER =
PASSWD = PASSWD =
; Receivers, can be one or more, e.g. ["1@example.com","2@example.com"] ; Receivers, can be one or more, e.g. 1@example.com,2@example.com
RECEIVERS = RECEIVERS =
; For "database" mode only ; For "database" mode only
@ -398,8 +411,8 @@ DEFAULT_INTERVAL = 8
MAX_RESPONSE_ITEMS = 50 MAX_RESPONSE_ITEMS = 50
[i18n] [i18n]
LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP LANGS = en-US,zh-CN,zh-HK,zh-TW,de-DE,fr-FR,nl-NL,lv-LV,ru-RU,ja-JP,es-ES,pt-BR,pl-PL,bg-BG,it-IT,fi-FI,tr-TR,cs-CZ,sr-SP,sv-SE,ko-KR,gl-ES
NAMES = English,简体中文,繁體中文(香港),繁體中文(台湾),Deutsch,Français,Nederlands,Latviešu,Русский,日本語,Español,Português do Brasil,Polski,български,Italiano,Suomalainen,Türkçe,čeština,Српски NAMES = English,简体中文,繁體中文(香港),繁體中文(台湾),Deutsch,Français,Nederlands,Latviešu,Русский,日本語,Español,Português do Brasil,Polski,български,Italiano,Suomalainen,Türkçe,čeština,Српски,Svenska,한국어,Galego
; Used for datetimepicker ; Used for datetimepicker
[i18n.datelang] [i18n.datelang]
@ -421,6 +434,10 @@ it-IT = it
fi-FI = fi fi-FI = fi
tr-TR = tr tr-TR = tr
cs-CZ = cs-CZ cs-CZ = cs-CZ
sr-SP = sr
sv-SE = sv
ko-KR = ko
gl-ES = gl
; Extension mapping to highlight class ; Extension mapping to highlight class
; e.g. .toml=ini ; e.g. .toml=ini

1
conf/locale/TRANSLATORS

@ -17,6 +17,7 @@ Barış Arda Yılmaz <ardayilmazgamer AT gmail DOT com>
Camille Baronnet <gogs AT camillebaronnet DOT fr> Camille Baronnet <gogs AT camillebaronnet DOT fr>
Christoph Kisfeld <christoph DOT kisfeld AT gmail DOT com> Christoph Kisfeld <christoph DOT kisfeld AT gmail DOT com>
Cysioland Cysioland
Damaris Padieu <damizx AT hotmail DOT fr>
Daniel Speichert <daniel AT speichert DOT pl> Daniel Speichert <daniel AT speichert DOT pl>
David Yzaguirre <dvdyzag AT gmail DOT com> David Yzaguirre <dvdyzag AT gmail DOT com>
Dmitriy Nogay <me AT catwhocode DOT ga> Dmitriy Nogay <me AT catwhocode DOT ga>

16
conf/locale/locale_bg-BG.ini

@ -137,6 +137,7 @@ issues.in_your_repos=Във Вашите хранилища
[explore] [explore]
repos=Хранилища repos=Хранилища
users=Потребители users=Потребители
organizations=Организации
search=Търсене search=Търсене
[auth] [auth]
@ -156,7 +157,6 @@ prohibit_login_desc=Вашият профил е със забрана за вл
resent_limit_prompt=За съжаление Вие съвсем наскоро изпратихте писмо за активация. Моля изчакайте 3 минути, след което опитайте отново. resent_limit_prompt=За съжаление Вие съвсем наскоро изпратихте писмо за активация. Моля изчакайте 3 минути, след което опитайте отново.
has_unconfirmed_mail=Здравейте %s, имате непотвърден адрес на ел. поща (<b>%s</b>). Ако не сте получили писмо за потвърждение или имате нужда да се изпрати ново писмо, моля щракнете бутона по-долу. has_unconfirmed_mail=Здравейте %s, имате непотвърден адрес на ел. поща (<b>%s</b>). Ако не сте получили писмо за потвърждение или имате нужда да се изпрати ново писмо, моля щракнете бутона по-долу.
resend_mail=Щракнете тук, за да се изпрати ново писмо за потвърждение resend_mail=Щракнете тук, за да се изпрати ново писмо за потвърждение
email_not_associate=Този адрес на ел. поща не е свързан с никой профил.
send_reset_mail=Щракнете тук, за да получите (отново) писмо за нулиране на паролата send_reset_mail=Щракнете тук, за да получите (отново) писмо за нулиране на паролата
reset_password=Нулиране на паролата reset_password=Нулиране на паролата
invalid_code=За съжаление Вашия код за потвърждение е изтекъл или е невалиден. invalid_code=За съжаление Вашия код за потвърждение е изтекъл или е невалиден.
@ -337,6 +337,10 @@ access_token_deletion=Изтрий индивидуален API ключ за д
access_token_deletion_desc=При изтриване на този индивидуален API ключ за достъп ще се премахнат всички свързани права на приложението. Желаете ли да продължите? access_token_deletion_desc=При изтриване на този индивидуален API ключ за достъп ще се премахнат всички свързани права на приложението. Желаете ли да продължите?
delete_token_success=Индивидуалният API ключ за достъп е изтрит успешно! Не забравяйте да преконфигурирате приложението също. delete_token_success=Индивидуалният API ключ за достъп е изтрит успешно! Не забравяйте да преконфигурирате приложението също.
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=Изтриване на собствения профил delete_account=Изтриване на собствения профил
delete_prompt=Тази операция ще изтрие Вашия профил завинаги и тя <strong>НЕ МОЖЕ</strong> да бъде отменена в последствие! delete_prompt=Тази операция ще изтрие Вашия профил завинаги и тя <strong>НЕ МОЖЕ</strong> да бъде отменена в последствие!
confirm_delete_account=Потвърди изтриването confirm_delete_account=Потвърди изтриването
@ -384,7 +388,8 @@ migrate_type=Тип мигриране
migrate_type_helper=Това хранилище ще бъде <span class="text blue">огледало</span> migrate_type_helper=Това хранилище ще бъде <span class="text blue">огледало</span>
migrate_repo=Мигрирай хранилище migrate_repo=Мигрирай хранилище
migrate.clone_address=Адрес за клониране migrate.clone_address=Адрес за клониране
migrate.clone_address_desc=Това може да е HTTP/HTTPS/GIT адрес или локален път на сървъра. migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=Недостатъчни права за импорт на локални хранилища. migrate.permission_denied=Недостатъчни права за импорт на локални хранилища.
migrate.invalid_local_path=Невалиден път - не съществува или не е директория. migrate.invalid_local_path=Невалиден път - не съществува или не е директория.
migrate.failed=Грешка при миграция: %v migrate.failed=Грешка при миграция: %v
@ -409,7 +414,7 @@ create_new_repo_command=Създай ново хранилище чрез ком
push_exist_repo=Предай съществуващо хранилище през командния ред push_exist_repo=Предай съществуващо хранилище през командния ред
repo_is_empty=Това хранилище е празно. Моля проверете по-късно пак! repo_is_empty=Това хранилище е празно. Моля проверете по-късно пак!
code=Код files=Files
branch=Клон branch=Клон
tree=ИН на ревизия tree=ИН на ревизия
filter_branch_and_tag=Филтър по маркер или клон filter_branch_and_tag=Филтър по маркер или клон
@ -426,6 +431,7 @@ file_history=История
file_view_raw=Виж директен файл file_view_raw=Виж директен файл
file_permalink=Постоянна връзка file_permalink=Постоянна връзка
file_too_large=Този файл е твърде голям за да се визуализира file_too_large=Този файл е твърде голям за да се визуализира
video_not_supported_in_browser=Вашият браузър не поддържа HTML5 видео тагове.
editor.new_file=Нов файл editor.new_file=Нов файл
editor.upload_file=Качи файл editor.upload_file=Качи файл
@ -455,6 +461,7 @@ editor.cancel=Отказ
editor.filename_cannot_be_empty=Името не може да бъде празно. editor.filename_cannot_be_empty=Името не може да бъде празно.
editor.branch_already_exists=Клон '%s' вече съществува в това хранилище. editor.branch_already_exists=Клон '%s' вече съществува в това хранилище.
editor.directory_is_a_file=Частта '%s' в пътя е файл, не директория в това хранилище. editor.directory_is_a_file=Частта '%s' в пътя е файл, не директория в това хранилище.
editor.file_is_a_symlink=Файл "%s" е символна връзка, която не може да се модифицира от редактора.
editor.filename_is_a_directory=Име '%s' вече съществува като директория в това хранилище. editor.filename_is_a_directory=Име '%s' вече съществува като директория в това хранилище.
editor.file_editing_no_longer_exists=Файл '%s' който редактирате вече не съществува в това хранилище. editor.file_editing_no_longer_exists=Файл '%s' който редактирате вече не съществува в това хранилище.
editor.file_changed_while_editing=Съдържанието на файла е било променено докато правихте редакциите. <a target="_blank" href="%s">Щракнете тук</a> за да прегледате какво е променено или <strong>натиснете Запис на ревизия</strong> отново за да презапишете чуждите промени. editor.file_changed_while_editing=Съдържанието на файла е било променено докато правихте редакциите. <a target="_blank" href="%s">Щракнете тук</a> за да прегледате какво е променено или <strong>натиснете Запис на ревизия</strong> отново за да презапишете чуждите промени.
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=Не може да се извърши обедин
pulls.cannot_auto_merge_helper=Моля, използвайте инструменти на командния ред за да разрешите конфликтите. pulls.cannot_auto_merge_helper=Моля, използвайте инструменти на командния ред за да разрешите конфликтите.
pulls.merge_pull_request=Обедини заявка за сливане pulls.merge_pull_request=Обедини заявка за сливане
pulls.open_unmerged_pull_exists=`Невъзможно повторно отваряне, защото вече съществува заявка за сливане (#%d) от същото хранилище със същата информация за обединяване, която чака да бъде извършена` pulls.open_unmerged_pull_exists=`Невъзможно повторно отваряне, защото вече съществува заявка за сливане (#%d) от същото хранилище със същата информация за обединяване, която чака да бъде извършена`
pulls.delete_branch=Изтрий клон
pulls.delete_branch_has_new_commits=Клонът не може да бъде изтрит, защото има ревизии след последното обединяване.
milestones.new=Нов етап milestones.new=Нов етап
milestones.open_tab=%d отворени milestones.open_tab=%d отворени
@ -1028,6 +1037,7 @@ auths.delete_auth_title=Изтрий удостоверяването
auths.delete_auth_desc=Това удостоверяване ще бъде изтрито. Желаете ли да продължите? auths.delete_auth_desc=Това удостоверяване ще бъде изтрито. Желаете ли да продължите?
auths.still_in_used=Това удостоверяване все още се използва от някои потребители. Моля изтрийте ги или ги конвертирайте до друг тип на влизане първо. auths.still_in_used=Това удостоверяване все още се използва от някои потребители. Моля изтрийте ги или ги конвертирайте до друг тип на влизане първо.
auths.deletion_success=Удостоверяването е изтрито успешно! auths.deletion_success=Удостоверяването е изтрито успешно!
auths.login_source_exist=Източник за валидация на потребители "%s" вече съществува.
config.server_config=Сървърни настройки config.server_config=Сървърни настройки
config.app_name=Име на приложението config.app_name=Име на приложението

214
conf/locale/locale_cs-CZ.ini

@ -13,7 +13,7 @@ version=Verze
page=Strana page=Strana
template=Šablona template=Šablona
language=Jazyk language=Jazyk
create_new=Vytořit... create_new=Vytvořit...
user_profile_and_more=Uživatelský profil a další user_profile_and_more=Uživatelský profil a další
signed_in_as=Přihlášen jako signed_in_as=Přihlášen jako
@ -96,8 +96,8 @@ offline_mode=Zapnout režim offline
offline_mode_popup=Vypnout síť doručování obsahu (CDN) i v produkčním režimu, vše bude obslouženo místně. offline_mode_popup=Vypnout síť doručování obsahu (CDN) i v produkčním režimu, vše bude obslouženo místně.
disable_gravatar=Vypnout službu Gravatar disable_gravatar=Vypnout službu Gravatar
disable_gravatar_popup=Vypnout službu Gravatar a ostatní zdroje. Všechny ikony uživatelů budou nahrány uživateli nebo výchozí. disable_gravatar_popup=Vypnout službu Gravatar a ostatní zdroje. Všechny ikony uživatelů budou nahrány uživateli nebo výchozí.
federated_avatar_lookup=Enable Federated Avatars Lookup federated_avatar_lookup=Povolit vyhledání avatarů z veřejných zdrojů
federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. federated_avatar_lookup_popup=Povolte vyhledání avatarů z veřejných zdrojů pro využití služeb založených na libravatar.
disable_registration=Vypnout možnost se zaregistrovat disable_registration=Vypnout možnost se zaregistrovat
disable_registration_popup=Vypnout možnost registrace, pouze správce může vytvořit účty. disable_registration_popup=Vypnout možnost registrace, pouze správce může vytvořit účty.
enable_captcha=Povolit službu CAPTCHA enable_captcha=Povolit službu CAPTCHA
@ -126,7 +126,7 @@ uname_holder=Uživatelské jméno nebo e-mailová adresa
password_holder=Heslo password_holder=Heslo
switch_dashboard_context=Přepnout kontext přehledu switch_dashboard_context=Přepnout kontext přehledu
my_repos=Mé repositáře my_repos=Mé repositáře
show_more_repos=Show more repositories... show_more_repos=Zobrazit více repositářů...
collaborative_repos=Společné repositáře collaborative_repos=Společné repositáře
my_orgs=Mé organizace my_orgs=Mé organizace
my_mirrors=Má zrcadla my_mirrors=Má zrcadla
@ -137,6 +137,7 @@ issues.in_your_repos=Ve vašich repositářích
[explore] [explore]
repos=Repositáře repos=Repositáře
users=Uživatelé users=Uživatelé
organizations=Organizace
search=Vyhledat search=Vyhledat
[auth] [auth]
@ -151,18 +152,17 @@ forget_password=Zapomněli jste heslo?
sign_up_now=Potřebujete účet? Zaregistrujte se. sign_up_now=Potřebujete účet? Zaregistrujte se.
confirmation_mail_sent_prompt=Nový potvrzovací e-mail byl zaslán na <b>%s</b>, prosíme, zkontrolujte si vaši doručenou poštu během následující %d hodin pro dokončení registračního procesu. confirmation_mail_sent_prompt=Nový potvrzovací e-mail byl zaslán na <b>%s</b>, prosíme, zkontrolujte si vaši doručenou poštu během následující %d hodin pro dokončení registračního procesu.
active_your_account=Aktivujte si váš účet active_your_account=Aktivujte si váš účet
prohibit_login=Login Prohibited prohibit_login=Přihlášení zakázáno
prohibit_login_desc=Vašemu účtu je zakázáno se přihlásit, kontaktujte prosím správce webu. prohibit_login_desc=Vašemu účtu je zakázáno se přihlásit, kontaktujte prosím správce webu.
resent_limit_prompt=Omlouváme se, ale před chvílí jste požádal o aktivační e-mail. Prosíme, počkejte 3 minuty a pak to zkuste znovu. resent_limit_prompt=Omlouváme se, ale před chvílí jste požádal o aktivační e-mail. Prosíme, počkejte 3 minuty a pak to zkuste znovu.
has_unconfirmed_mail=Zdravím, %s, máte nepotvrzenou e-mailovou adresu (<b>%s</b>). Pokud jste nedostali e-mail pro potvrzení nebo potřebujete zaslat nový, klikněte prosím na tlačítku níže. has_unconfirmed_mail=Zdravím, %s, máte nepotvrzenou e-mailovou adresu (<b>%s</b>). Pokud jste nedostali e-mail pro potvrzení nebo potřebujete zaslat nový, klikněte prosím na tlačítku níže.
resend_mail=Klikněte zde pro odeslání aktivačního e-mailu resend_mail=Klikněte zde pro odeslání aktivačního e-mailu
email_not_associate=Tato e-mailová adresa není spojena s žádným účtem.
send_reset_mail=Klikněte zde pro znovuposlání e-mailu pro změnu vašeho hesla send_reset_mail=Klikněte zde pro znovuposlání e-mailu pro změnu vašeho hesla
reset_password=Obnova vašeho hesla reset_password=Obnova vašeho hesla
invalid_code=Omlouváme se, ale kód potvrzení vašeho účtu vypršel nebo není správný. invalid_code=Omlouváme se, ale kód potvrzení vašeho účtu vypršel nebo není správný.
reset_password_helper=Klikněte zde pro obnovu vašeho hesla reset_password_helper=Klikněte zde pro obnovu vašeho hesla
password_too_short=Délka hesla musí být minimálně 6 znaků. password_too_short=Délka hesla musí být minimálně 6 znaků.
non_local_account=Non-local accounts cannot change passwords through Gogs. non_local_account=Externí účty nemohou měnit hesla přes Gogs.
[mail] [mail]
activate_account=Prosíme, aktivujte si váš účet activate_account=Prosíme, aktivujte si váš účet
@ -190,11 +190,11 @@ AuthName=Název ověření
AdminEmail=E-mailová adresa správce AdminEmail=E-mailová adresa správce
NewBranchName=Název nové větve NewBranchName=Název nové větve
CommitSummary=Commit summary CommitSummary=Shrnutí revize
CommitMessage=Commit message CommitMessage=Zpráva revize
CommitChoice=Commit choice CommitChoice=Výběr revize
TreeName=Cesta k souboru TreeName=Cesta k souboru
Content=Content Content=Obsah
require_error=` nemůže být prázdný.` require_error=` nemůže být prázdný.`
alpha_dash_error=` musí být pouze písmena, číslice či znaky - a _ .` alpha_dash_error=` musí být pouze písmena, číslice či znaky - a _ .`
@ -232,7 +232,7 @@ org_still_own_repo=Tato organizace stále vlastní repositáře, musíte je nejd
target_branch_not_exist=Cílová větev neexistuje. target_branch_not_exist=Cílová větev neexistuje.
[user] [user]
change_avatar=Change your avatar change_avatar=Změnit vaši uživatelskou ikonu
join_on=Připojil se dne join_on=Připojil se dne
repositories=Repositáře repositories=Repositáře
activity=Veřejná aktivita activity=Veřejná aktivita
@ -248,7 +248,7 @@ form.name_pattern_not_allowed=Vzor uživatelského jména '%s' není povolen.
[settings] [settings]
profile=Profil profile=Profil
password=Heslo password=Heslo
avatar=Avatar avatar=Uživatelská ikona
ssh_keys=Klíče SSH ssh_keys=Klíče SSH
social=Sociální účty social=Sociální účty
applications=Aplikace applications=Aplikace
@ -269,8 +269,8 @@ change_username_prompt=Tato změna ovlivní vztah odkazů k vašemu účtu.
continue=Pokračovat continue=Pokračovat
cancel=Zrušit cancel=Zrušit
lookup_avatar_by_mail=Vyhledávat Avatar podle emailu lookup_avatar_by_mail=Vyhledávat uživatelskou ikonu podle emailu
federated_avatar_lookup=Federated Avatar Lookup federated_avatar_lookup=Vyhledání Avatarů ve veřejných zdrojích
enable_custom_avatar=Povolit uživatelskou ikonu uživatele enable_custom_avatar=Povolit uživatelskou ikonu uživatele
choose_new_avatar=Vybrat novou ikonu uživatele choose_new_avatar=Vybrat novou ikonu uživatele
update_avatar=Aktualizovat nastavení ikony uživatele update_avatar=Aktualizovat nastavení ikony uživatele
@ -337,6 +337,10 @@ access_token_deletion=Smazání osobní přístupové poukázky
access_token_deletion_desc=Smazáním této osobní přístupové poukázky odstraní všechen návazný přístup aplikace. Chcete pokračovat? access_token_deletion_desc=Smazáním této osobní přístupové poukázky odstraní všechen návazný přístup aplikace. Chcete pokračovat?
delete_token_success=Osobní přístupová poukázka byla úspěšně odstraněna! Nezapomeňte také aktualizovat vaši aplikaci. delete_token_success=Osobní přístupová poukázka byla úspěšně odstraněna! Nezapomeňte také aktualizovat vaši aplikaci.
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=Smazat váš účet delete_account=Smazat váš účet
delete_prompt=Tato operace permanentně smaže váš účet a tato změna <strong>nemůže</strong> být vrácena! delete_prompt=Tato operace permanentně smaže váš účet a tato změna <strong>nemůže</strong> být vrácena!
confirm_delete_account=Potvrdit smazání confirm_delete_account=Potvrdit smazání
@ -357,7 +361,7 @@ fork_from=Rozštěpit z
fork_visiblity_helper=Nemůžete změnit viditelnost repositáře rozštěpení. fork_visiblity_helper=Nemůžete změnit viditelnost repositáře rozštěpení.
repo_desc=Popis repo_desc=Popis
repo_lang=Jazyk repo_lang=Jazyk
repo_gitignore_helper=Select .gitignore templates repo_gitignore_helper=Vyberte šablony .gitignore
license=Licence license=Licence
license_helper=Vyberte licenční soubor license_helper=Vyberte licenční soubor
readme=Soubor README readme=Soubor README
@ -365,12 +369,12 @@ readme_helper=Vyberte šablonu souboru README
auto_init=Inicializovat tento repositář s vybranými soubory a šablonou auto_init=Inicializovat tento repositář s vybranými soubory a šablonou
create_repo=Vytvořit repositář create_repo=Vytvořit repositář
default_branch=Výchozí větev default_branch=Výchozí větev
mirror_prune=Prune mirror_prune=Vyčistit
mirror_prune_desc=Remove any remote-tracking references that no longer exist on the remote mirror_prune_desc=Odstranit vzdálené odkazy, které již ve vzdáleném repozitáři neexistují
mirror_interval=Odstup zrcadlení (hodina) mirror_interval=Odstup zrcadlení (hodina)
mirror_address=Adresa zrcadla mirror_address=Adresa zrcadla
mirror_address_desc=Prosím, přidejte do adresy potřebné přihlašovací údaje. mirror_address_desc=Prosím, přidejte do adresy potřebné přihlašovací údaje.
mirror_last_synced=Last Synced mirror_last_synced=Naposledy synchronizováno
watchers=Sledující watchers=Sledující
stargazers=Sledující stargazers=Sledující
forks=Rozštěpení forks=Rozštěpení
@ -384,7 +388,8 @@ migrate_type=Typ migrace
migrate_type_helper=Tento repositář bude <span class="text blue">zrcadlem</span> migrate_type_helper=Tento repositář bude <span class="text blue">zrcadlem</span>
migrate_repo=Přenést repositář migrate_repo=Přenést repositář
migrate.clone_address=Naklonovat adresu migrate.clone_address=Naklonovat adresu
migrate.clone_address_desc=Tím může být HTTP/HTTPS/GIT URL nebo cesta k lokálnímu serveru. migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=Není dovoleno importovat místní repositáře. migrate.permission_denied=Není dovoleno importovat místní repositáře.
migrate.invalid_local_path=Neplatná místní cesta, buď neexistuje nebo není adresářem. migrate.invalid_local_path=Neplatná místní cesta, buď neexistuje nebo není adresářem.
migrate.failed=Přenesení selhalo: %v migrate.failed=Přenesení selhalo: %v
@ -409,7 +414,7 @@ create_new_repo_command=Vytvořit nový repositář v příkazové řádce
push_exist_repo=Nahrát existující repositář z příkazové řádky push_exist_repo=Nahrát existující repositář z příkazové řádky
repo_is_empty=Tento repositář je prázdný, prosíme, vraťte se brzo zpátky! repo_is_empty=Tento repositář je prázdný, prosíme, vraťte se brzo zpátky!
code=Zdrojový kód files=Files
branch=Větev branch=Větev
tree=Strom tree=Strom
filter_branch_and_tag=Filtr pro větev nebo značku filter_branch_and_tag=Filtr pro větev nebo značku
@ -426,44 +431,46 @@ file_history=Historie
file_view_raw=Zobrazit v surovém stavu file_view_raw=Zobrazit v surovém stavu
file_permalink=Trvalý odkaz file_permalink=Trvalý odkaz
file_too_large=Tento soubor je příliš velký pro zobrazení file_too_large=Tento soubor je příliš velký pro zobrazení
video_not_supported_in_browser=Váš prohlížeč nepodporuje tag pro HTML5 video.
editor.new_file=New file editor.new_file=Nový soubor
editor.upload_file=Upload file editor.upload_file=Nahrát soubor
editor.edit_file=Edit file editor.edit_file=Upravit soubor
editor.preview_changes=Preview Changes editor.preview_changes=Náhled změn
editor.cannot_edit_non_text_files=Netextové soubory není možné upravovat editor.cannot_edit_non_text_files=Netextové soubory není možné upravovat
editor.edit_this_file=Edit this file editor.edit_this_file=Upravit tento soubor
editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file editor.must_be_on_a_branch=Musíte mít zvolenu větev pro úpravu či návrh změn tohoto souboru
editor.fork_before_edit=You must fork this repository before editing the file editor.fork_before_edit=Musíte provést rozvětvení repositáře před úpravou souboru
editor.delete_this_file=Odstranit tento soubor editor.delete_this_file=Odstranit tento soubor
editor.must_have_write_access=Musíte mít přístup pro zápis pro dělání či navrhování změn tohoto souboru editor.must_have_write_access=Musíte mít přístup pro zápis pro dělání či navrhování změn tohoto souboru
editor.file_delete_success=Soubor '%s' byl úspěšně odstraněn! editor.file_delete_success=Soubor '%s' byl úspěšně odstraněn!
editor.name_your_file=Name your file... editor.name_your_file=Pojmenujte váš soubor...
editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. editor.filename_help=Pro vložení adresáře prostě napište jméno a přidejte /. K odstranění adresáře běžte na začátek pole a stiskněte backspace.
editor.or=nebo editor.or=nebo
editor.cancel_lower=cancel editor.cancel_lower=zrušit
editor.commit_changes=Commit Changes editor.commit_changes=Uložit změny revize
editor.add_tmpl=Add '%s/<filename>' editor.add_tmpl=Přidat '%s/<nazev_souboru>'
editor.add=Add '%s' editor.add=Přidat '%s'
editor.update=Aktualizovat "%s" editor.update=Aktualizovat "%s"
editor.delete=Delete '%s' editor.delete=Smazat '%s'
editor.commit_message_desc=Add an optional extended description... editor.commit_message_desc=Přidat dobrovolný rozšířený popis...
editor.commit_directly_to_this_branch=Commit directly to the <strong class="branch-name">%s</strong> branch. editor.commit_directly_to_this_branch=Uložte změny revize přímo do větve <strong class="branch-name">%s</strong>.
editor.create_new_branch=Create a <strong>new branch</strong> for this commit and start a pull request. editor.create_new_branch=Vytvořit <strong>novou větev</strong> pro tuto revizi a spustit požadavek na stažení.
editor.new_branch_name_desc=Nový název větve... editor.new_branch_name_desc=Nový název větve...
editor.cancel=Zrušit editor.cancel=Zrušit
editor.filename_cannot_be_empty=Filename cannot be empty. editor.filename_cannot_be_empty=Název souboru nemůže být prázdný.
editor.branch_already_exists=Branch '%s' already exists in this repository. editor.branch_already_exists=Repositář větev '%s' již obsahuje.
editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. editor.directory_is_a_file=Položka '%s' v nadřazené cestě je v tomto repozitáři soubor, ne adresář.
editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. editor.file_is_a_symlink=Soubor '%s' je symbolický odkaz a nemůže být změněn pomocí webového editoru.
editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. editor.filename_is_a_directory=Jméno souboru '%s' koliduje v tomto repozitáři se jménem adresáře.
editor.file_editing_no_longer_exists=Soubor '%s', který upravujete, již neexistuje v tomto repozitáři.
editor.file_changed_while_editing=Obsah souboru se změnil od začátku úprav. <a target="_blank" href="%s"> Klepnutím sem</a> zobrazíte, co se změnilo, nebo <strong>stiskněte potvrdit znovu</strong> pro přepsání změn. editor.file_changed_while_editing=Obsah souboru se změnil od začátku úprav. <a target="_blank" href="%s"> Klepnutím sem</a> zobrazíte, co se změnilo, nebo <strong>stiskněte potvrdit znovu</strong> pro přepsání změn.
editor.file_already_exists=A file with name '%s' already exists in this repository. editor.file_already_exists=Soubor '%s' již existuje v tomto repozitáři.
editor.no_changes_to_show=There are no changes to show. editor.no_changes_to_show=Žádné změny k zobrazení.
editor.fail_to_update_file=Failed to update/create file '%s' with error: %v editor.fail_to_update_file=Vytvoření nebo změna souboru '%s' skončilo chybou: %v
editor.add_subdir=Add subdirectory... editor.add_subdir=Přidat podadresář...
editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v editor.unable_to_upload_files=Nepodařilo se nahrát soubor '%s'. Chyba: %v
editor.upload_files_to_dir=Upload files to '%s' editor.upload_files_to_dir=Nahrát soubory do '%s'
commits.commits=Revize commits.commits=Revize
commits.search=Hledání revizí commits.search=Hledání revizí
@ -490,11 +497,11 @@ issues.create=Vytvořit úkol
issues.new_label=Nový štítek issues.new_label=Nový štítek
issues.new_label_placeholder=Název štítku... issues.new_label_placeholder=Název štítku...
issues.create_label=Vytvořit štítek issues.create_label=Vytvořit štítek
issues.label_templates.title=Load a predefined set of labels issues.label_templates.title=Nahrát předdefinovanou sadu značek
issues.label_templates.info=There aren’t any labels yet. You can click on the "New Label" button above to create one or use a predefined set below. issues.label_templates.info=Nejsou zadány žádné značky. Pro vytvoření nové klikněte na tlačítko Nová značka nebo použijte předdefinovanou sadu.
issues.label_templates.helper=Select a label set issues.label_templates.helper=Vyberte sadu značek
issues.label_templates.use=Use this label set issues.label_templates.use=Použít tuto sadu značek
issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v issues.label_templates.fail_to_load_file=Nepodařilo se nahrát soubor šablony značek '%s': %v
issues.open_tab=%d otevřených issues.open_tab=%d otevřených
issues.close_tab=%d zavřených issues.close_tab=%d zavřených
issues.filter_label=Štítek issues.filter_label=Štítek
@ -522,8 +529,8 @@ issues.next=Další
issues.open_title=otevřený issues.open_title=otevřený
issues.closed_title=zavřený issues.closed_title=zavřený
issues.num_comments=%d komentářů issues.num_comments=%d komentářů
issues.commented_at=`commented <a href="#%s">%s</a>` issues.commented_at=`okomentoval <a href="#%s">%s</a>`
issues.delete_comment_confirm=Are you sure you want to delete this comment? issues.delete_comment_confirm=Jste si jist, že chcete smazat tento komentář?
issues.no_content=Není zde žádný obsah. issues.no_content=Není zde žádný obsah.
issues.close_issue=Zavřít issues.close_issue=Zavřít
issues.close_comment_issue=Okomentovat a zavřít issues.close_comment_issue=Okomentovat a zavřít
@ -536,7 +543,7 @@ issues.commit_ref_at=`odkázal na tento úkol z revize <a id="%[1]s" href="#%[1]
issues.poster=Autor issues.poster=Autor
issues.collaborator=Spolupracovník issues.collaborator=Spolupracovník
issues.owner=Vlastník issues.owner=Vlastník
issues.sign_in_require_desc=<a href="%s">Sign in</a> to join this conversation. issues.sign_in_require_desc=<a href="%s">Přihlašte se</a> pro zapojení do konverzace.
issues.edit=Upravit issues.edit=Upravit
issues.cancel=Zrušit issues.cancel=Zrušit
issues.save=Uložit issues.save=Uložit
@ -551,8 +558,8 @@ issues.label_deletion=Smazání štítku
issues.label_deletion_desc=Smazání tohoto štítku jej smaže také ze všech návazných úkolech. Chcete pokračovat? issues.label_deletion_desc=Smazání tohoto štítku jej smaže také ze všech návazných úkolech. Chcete pokračovat?
issues.label_deletion_success=Štítek byl úspěšně smazán! issues.label_deletion_success=Štítek byl úspěšně smazán!
issues.num_participants=%d účastníků issues.num_participants=%d účastníků
issues.attachment.open_tab=`Click to see "%s" in a new tab` issues.attachment.open_tab=`Klikněte pro zobrazení "%s" v nové záložce`
issues.attachment.download=`Click to download "%s"` issues.attachment.download=`Klikněte pro stažení "%s"`
pulls.new=Nový požadavek na natažení pulls.new=Nový požadavek na natažení
pulls.compare_changes=Porovnat změny pulls.compare_changes=Porovnat změny
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=Tento požadavek na natažení nemůže být automa
pulls.cannot_auto_merge_helper=Prosíme proveďte sloučení ručně, aby byly vyřešeny konflitky. pulls.cannot_auto_merge_helper=Prosíme proveďte sloučení ručně, aby byly vyřešeny konflitky.
pulls.merge_pull_request=Sloučit požadavek na stažení pulls.merge_pull_request=Sloučit požadavek na stažení
pulls.open_unmerged_pull_exists=`Nemůžete znovuotevřít požadavek na stažení, neboť požadavek na stažení ze stejného repositáře se stejnými informacemi pro sloučení již existuje (#%d).` pulls.open_unmerged_pull_exists=`Nemůžete znovuotevřít požadavek na stažení, neboť požadavek na stažení ze stejného repositáře se stejnými informacemi pro sloučení již existuje (#%d).`
pulls.delete_branch=Smazat větev
pulls.delete_branch_has_new_commits=Větev nemůže být smazána, neboť po sloučení jsou v ní nové revize.
milestones.new=Nový milník milestones.new=Nový milník
milestones.open_tab=%d otevřených milestones.open_tab=%d otevřených
@ -625,32 +634,32 @@ wiki.last_updated=Naposledy aktualizováno: %s
settings=Nastavení settings=Nastavení
settings.options=Možnosti settings.options=Možnosti
settings.collaboration=Spolupráce settings.collaboration=Spolupráce
settings.collaboration.admin=Admin settings.collaboration.admin=Správce
settings.collaboration.write=Write settings.collaboration.write=Zápis
settings.collaboration.read=Read settings.collaboration.read=Čtení
settings.collaboration.undefined=Undefined settings.collaboration.undefined=Neurčeno
settings.hooks=Webové háčky settings.hooks=Webové háčky
settings.githooks=Háčky Gitu settings.githooks=Háčky Gitu
settings.basic_settings=Základní nastavení settings.basic_settings=Základní nastavení
settings.mirror_settings=Mirror Settings settings.mirror_settings=Nastavení zrcadla
settings.sync_mirror=Sync Now settings.sync_mirror=Provést synchronizaci
settings.mirror_sync_in_progress=Mirror syncing is in progress, please refresh page in about a minute. settings.mirror_sync_in_progress=Synchronizace zrcadel probíhá, prosím načtěte znovu stránku přibližně za minutu.
settings.site=Oficiální stránky settings.site=Oficiální stránky
settings.update_settings=Změnit nastavení settings.update_settings=Změnit nastavení
settings.change_reponame_prompt=Tato změna ovlivní vztah odkazů k repositáři. settings.change_reponame_prompt=Tato změna ovlivní vztah odkazů k repositáři.
settings.advanced_settings=Pokročilá nastavení settings.advanced_settings=Pokročilá nastavení
settings.wiki_desc=Enable wiki system settings.wiki_desc=Povolit systém Wiki
settings.use_internal_wiki=Use builtin wiki settings.use_internal_wiki=Použít vestavěný systém Wiki
settings.use_external_wiki=Používat externí Wiki settings.use_external_wiki=Používat externí Wiki
settings.external_wiki_url=URL externí Wiki settings.external_wiki_url=URL externí Wiki
settings.external_wiki_url_desc=Návštěvníci budou při kliknutí na záložku přesměrování na tuto URL. settings.external_wiki_url_desc=Návštěvníci budou při kliknutí na záložku přesměrování na tuto URL.
settings.issues_desc=Enable issue tracker settings.issues_desc=Povolit systém úkolů
settings.use_internal_issue_tracker=Use builtin lightweight issue tracker settings.use_internal_issue_tracker=Povolit věstavěný odlehčený systém úkolů
settings.use_external_issue_tracker=Použít externí systém úkolů settings.use_external_issue_tracker=Použít externí systém úkolů
settings.tracker_url_format=Formát URL externího systému úkolů settings.tracker_url_format=Formát URL externího systému úkolů
settings.tracker_issue_style=External Issue Tracker Naming Style: settings.tracker_issue_style=Styl pojmenování externího systému úkolů:
settings.tracker_issue_style.numeric=Numeric settings.tracker_issue_style.numeric=Číselný
settings.tracker_issue_style.alphanumeric=Alphanumeric settings.tracker_issue_style.alphanumeric=Alfanumerický
settings.tracker_url_format_desc=Můžete použít zástupné výrazy <code>{user} {repo} {index}</code> pro uživatelské jméno, název repositáře a index úkolu. settings.tracker_url_format_desc=Můžete použít zástupné výrazy <code>{user} {repo} {index}</code> pro uživatelské jméno, název repositáře a index úkolu.
settings.pulls_desc=Povolit požadavky na stažení, aby veřejné příspěvky mohly být akceptovány settings.pulls_desc=Povolit požadavky na stažení, aby veřejné příspěvky mohly být akceptovány
settings.danger_zone=Nebezpečná zóna settings.danger_zone=Nebezpečná zóna
@ -673,7 +682,7 @@ settings.delete=Smazat tento repositář
settings.delete_desc=Jakmile smažete repositář, není možné se vrátit. Buďte si, prosím, jist. settings.delete_desc=Jakmile smažete repositář, není možné se vrátit. Buďte si, prosím, jist.
settings.delete_notices_1=- Tuto operaci <strong>nelze</strong> zvrátit. settings.delete_notices_1=- Tuto operaci <strong>nelze</strong> zvrátit.
settings.delete_notices_2=Tato operace permanentně smaže vše v tomto repositáři, včetně dat Gitu, úkolů, komentářů a přístupu spolupracovníků. settings.delete_notices_2=Tato operace permanentně smaže vše v tomto repositáři, včetně dat Gitu, úkolů, komentářů a přístupu spolupracovníků.
settings.delete_notices_fork_1=- All forks will become independent after deletion. settings.delete_notices_fork_1=- Po smazání se všechny forky se stanou nezávislé.
settings.deletion_success=Repositář byl úspěšně smazán! settings.deletion_success=Repositář byl úspěšně smazán!
settings.update_settings_success=Možnosti repositáře byly úspěšně změněny. settings.update_settings_success=Možnosti repositáře byly úspěšně změněny.
settings.transfer_owner=Nový vlastník settings.transfer_owner=Nový vlastník
@ -720,8 +729,8 @@ settings.event_send_everything=Potřebuji <strong>vše</strong>.
settings.event_choose=Nech mne vybrat, co potřebuji. settings.event_choose=Nech mne vybrat, co potřebuji.
settings.event_create=Vytvořit settings.event_create=Vytvořit
settings.event_create_desc=Větev nebo značka byla vytvořena settings.event_create_desc=Větev nebo značka byla vytvořena
settings.event_pull_request=Pull Request settings.event_pull_request=Požadavek na stažení
settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. settings.event_pull_request_desc=Pull request byl otevřen, uzavřen, znovu-otevřen, upraven, přiřazen, zrušeno přiřazení, popis upraven, smazán nebo synchronizován.
settings.event_push=Nahrát settings.event_push=Nahrát
settings.event_push_desc=Nahrání pomocí Gitu do repositáře settings.event_push_desc=Nahrání pomocí Gitu do repositáře
settings.active=Aktivní settings.active=Aktivní
@ -759,8 +768,8 @@ diff.show_unified_view=Jednotný pohled
diff.stats_desc=<strong> %d změnil soubory</strong>, kde provedl <strong>%d přidání</strong> a <strong>%d odebrání</strong> diff.stats_desc=<strong> %d změnil soubory</strong>, kde provedl <strong>%d přidání</strong> a <strong>%d odebrání</strong>
diff.bin=binární diff.bin=binární
diff.view_file=Zobrazit soubor diff.view_file=Zobrazit soubor
diff.file_suppressed=File diff suppressed because it is too large diff.file_suppressed=Diff nebyl zobrazen, protože je příliš veliký
diff.too_many_files=Some files were not shown because too many files changed in this diff diff.too_many_files=Některé soubory nejsou zobrazny, neboť je v této revizi změněno mnoho souborů
release.releases=Vydání release.releases=Vydání
release.new_release=Nové vydání release.new_release=Nové vydání
@ -791,7 +800,7 @@ release.deletion=Smazání vydání
release.deletion_desc=Smazáním tohoto vydání se také smaže odpovídající značka. Chcete pokračovat? release.deletion_desc=Smazáním tohoto vydání se také smaže odpovídající značka. Chcete pokračovat?
release.deletion_success=Vydání bylo úspěšně smazáno! release.deletion_success=Vydání bylo úspěšně smazáno!
release.tag_name_already_exist=Vydání s touto značkou již existuje. release.tag_name_already_exist=Vydání s touto značkou již existuje.
release.tag_name_invalid=Tag name is not valid. release.tag_name_invalid=Název štítku není platný.
release.downloads=Soubory ke stažení release.downloads=Soubory ke stažení
[org] [org]
@ -860,7 +869,7 @@ teams.owners_permission_desc=Vlastníci mají plný přístup do <strong>všech
teams.members=Členové týmu teams.members=Členové týmu
teams.update_settings=Upravit nastavení teams.update_settings=Upravit nastavení
teams.delete_team=Smazat tento tým teams.delete_team=Smazat tento tým
teams.add_team_member=Přidát člena týmu teams.add_team_member=Přidat člena týmu
teams.delete_team_title=Smazání týmu teams.delete_team_title=Smazání týmu
teams.delete_team_desc=Jelikož bude tento tým smazán, jeho členové mohou ztratit přístup do některých repositářů. Chcete pokračovat? teams.delete_team_desc=Jelikož bude tento tým smazán, jeho členové mohou ztratit přístup do některých repositářů. Chcete pokračovat?
teams.delete_team_success=Daný tým byl úspěšně smazán. teams.delete_team_success=Daný tým byl úspěšně smazán.
@ -959,7 +968,7 @@ users.edit_account=Upravit účet
users.max_repo_creation=Limit počtu vytvořených repositářů users.max_repo_creation=Limit počtu vytvořených repositářů
users.max_repo_creation_desc=(Nastavte na -1 pro použití výchozího systémového limitu) users.max_repo_creation_desc=(Nastavte na -1 pro použití výchozího systémového limitu)
users.is_activated=Tento účet je aktivován users.is_activated=Tento účet je aktivován
users.prohibit_login=This account is prohibited to login users.prohibit_login=Tento účet má zakázáno přihlášení
users.is_admin=Tento účet je správce users.is_admin=Tento účet je správce
users.allow_git_hook=Tento účet má právo vytváře háčky Gitu users.allow_git_hook=Tento účet má právo vytváře háčky Gitu
users.allow_import_local=Tento účet má právo importovat místní repositáře users.allow_import_local=Tento účet má právo importovat místní repositáře
@ -990,7 +999,7 @@ auths.enabled=Povolený
auths.updated=Upravený auths.updated=Upravený
auths.auth_type=Typ ověření auths.auth_type=Typ ověření
auths.auth_name=Název ověření auths.auth_name=Název ověření
auths.security_protocol=Security Protocol auths.security_protocol=Protokol zabezpečení
auths.domain=Doména auths.domain=Doména
auths.host=Server auths.host=Server
auths.port=Port auths.port=Port
@ -1028,6 +1037,7 @@ auths.delete_auth_title=Smazání způsobu ověřování
auths.delete_auth_desc=Tento způsob ověřování bude smazán, chcete pokračovat? auths.delete_auth_desc=Tento způsob ověřování bude smazán, chcete pokračovat?
auths.still_in_used=Tento způsob ověřování je stále používán některými uživateli. Prosím, nejdříve změňte u těchto uživatelů typ ověřování na jiný. auths.still_in_used=Tento způsob ověřování je stále používán některými uživateli. Prosím, nejdříve změňte u těchto uživatelů typ ověřování na jiný.
auths.deletion_success=Způsob ověřování byl úspěšně smazán! auths.deletion_success=Způsob ověřování byl úspěšně smazán!
auths.login_source_exist=Zdroj přihlášení '%s' již existuje.
config.server_config=Nastavení serveru config.server_config=Nastavení serveru
config.app_name=Název aplikace config.app_name=Název aplikace
@ -1113,19 +1123,19 @@ config.cookie_life_time=Doba života souboru cookie
config.picture_config=Nastavení ikony uživatele config.picture_config=Nastavení ikony uživatele
config.picture_service=Služba ikon uživatelů config.picture_service=Služba ikon uživatelů
config.disable_gravatar=Zakázat službu Gravatar config.disable_gravatar=Zakázat službu Gravatar
config.enable_federated_avatar=Enable Federated Avatars config.enable_federated_avatar=Povolit jednotné avatary
config.git_config=Git Configuration config.git_config=Konfigurace Gitu
config.git_disable_diff_highlight=Disable Diff Syntax Highlight config.git_disable_diff_highlight=Zakázat zvýraznění syntaxe v rozdílovém zobrazení
config.git_max_diff_lines=Max Diff Lines (for a single file) config.git_max_diff_lines=Maximální počet rozdílových řádků jednoho souboru
config.git_max_diff_line_characters=Max Diff Characters (for a single line) config.git_max_diff_line_characters=Maximální počet zobrazených rozdílových znaků
config.git_max_diff_files=Max Diff Files (to be shown) config.git_max_diff_files=Maximální počet zobrazených rozdílových souborů
config.git_gc_args=GC Arguments config.git_gc_args=Parametry GC
config.git_migrate_timeout=Migration Timeout config.git_migrate_timeout=Časový limit migrace
config.git_mirror_timeout=Mirror Update Timeout config.git_mirror_timeout=Časový limit aktualizace zrcadla
config.git_clone_timeout=Clone Operation Timeout config.git_clone_timeout=Časový limit operace naklonování
config.git_pull_timeout=Pull Operation Timeout config.git_pull_timeout=Časový limit operace stažení
config.git_gc_timeout=GC Operation Timeout config.git_gc_timeout=Časový limit operace GC
config.log_config=Nastavení logů config.log_config=Nastavení logů
config.log_mode=Způsob logování config.log_mode=Způsob logování
@ -1182,13 +1192,13 @@ now=nyní
1w=%s 1 týdnem 1w=%s 1 týdnem
1mon=%s 1 měsícem 1mon=%s 1 měsícem
1y=%s 1 rokem 1y=%s 1 rokem
seconds=%s %d sekundami seconds=%[2]s %[1]d sekundami
minutes=%s %d minutami minutes=%[2]s %[1]d minutami
hours=%s %d hodinami hours=%[2]s %[1]d hodinami
days=%s %d dny days=%[2]s %[1]d dny
weeks=%s %d týdny weeks=%[2]s %[1]d týdny
months=%s %d měsíci months=%[2]s %[1]d měsíci
years=%s %d roky years=%[2]s %[1]d roky
raw_seconds=sekund raw_seconds=sekund
raw_minutes=minut raw_minutes=minut

42
conf/locale/locale_de-DE.ini

@ -137,6 +137,7 @@ issues.in_your_repos=In Ihren Repositories
[explore] [explore]
repos=Repositories repos=Repositories
users=Benutzer users=Benutzer
organizations=Organisationen
search=Suche search=Suche
[auth] [auth]
@ -156,7 +157,6 @@ prohibit_login_desc=Ihrem Konto ist es nicht gestattet sich anzumelden. Bitte ko
resent_limit_prompt=Es tut uns leid, aber Sie haben bereits eine Aktivierungs-E-Mail angefordert. Bitte warten Sie 3 Minuten und probieren Sie es dann nochmal. resent_limit_prompt=Es tut uns leid, aber Sie haben bereits eine Aktivierungs-E-Mail angefordert. Bitte warten Sie 3 Minuten und probieren Sie es dann nochmal.
has_unconfirmed_mail=Hallo %s, Sie haben eine unbestätigte E-Mail-Adresse (<b>%s</b>). Wenn Sie keine Bestätigungs-E-Mail erhalten haben oder eine neue benötigen, klicken Sie bitte auf den folgenden Button. has_unconfirmed_mail=Hallo %s, Sie haben eine unbestätigte E-Mail-Adresse (<b>%s</b>). Wenn Sie keine Bestätigungs-E-Mail erhalten haben oder eine neue benötigen, klicken Sie bitte auf den folgenden Button.
resend_mail=Hier klicken, um die Aktivierungs-E-Mail erneut zu versenden resend_mail=Hier klicken, um die Aktivierungs-E-Mail erneut zu versenden
email_not_associate=Diese E-Mail-Adresse ist mit keinem Konto verknüpft.
send_reset_mail=Hier klicken, um die E-Mail zum Passwort-zurücksetzen erneut zu versenden send_reset_mail=Hier klicken, um die E-Mail zum Passwort-zurücksetzen erneut zu versenden
reset_password=Passwort zurücksetzen reset_password=Passwort zurücksetzen
invalid_code=Es tut uns leid, der Bestätigungscode ist abgelaufen oder ungültig. invalid_code=Es tut uns leid, der Bestätigungscode ist abgelaufen oder ungültig.
@ -337,6 +337,10 @@ access_token_deletion=Persönlichen Token entfernen
access_token_deletion_desc=Das Löschen dieses persönlichen Zugangs-Tokens wird alle zugehörigen Zugriffe der Anwendung entfernen. Möchten Sie fortfahren? access_token_deletion_desc=Das Löschen dieses persönlichen Zugangs-Tokens wird alle zugehörigen Zugriffe der Anwendung entfernen. Möchten Sie fortfahren?
delete_token_success=Persönlicher Zugriffs-Token wurde erfolgreich entfernt! Vergessen Sie nicht Ihre Anwendung zu aktualisieren. delete_token_success=Persönlicher Zugriffs-Token wurde erfolgreich entfernt! Vergessen Sie nicht Ihre Anwendung zu aktualisieren.
orgs.none=Sie sind kein Mitglied einer Organisation.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=Konto löschen delete_account=Konto löschen
delete_prompt=Diese Aktion wird Ihr Konto dauerhaft löschen und kann <strong>NICHT</strong> rückgängig gemacht werden! delete_prompt=Diese Aktion wird Ihr Konto dauerhaft löschen und kann <strong>NICHT</strong> rückgängig gemacht werden!
confirm_delete_account=Löschvorgang bestätigen confirm_delete_account=Löschvorgang bestätigen
@ -384,7 +388,8 @@ migrate_type=Migrationstyp
migrate_type_helper=Dieses Repository wird ein <span class="text blue">Mirror</span> sein migrate_type_helper=Dieses Repository wird ein <span class="text blue">Mirror</span> sein
migrate_repo=Repository migrieren migrate_repo=Repository migrieren
migrate.clone_address=Adresse kopieren migrate.clone_address=Adresse kopieren
migrate.clone_address_desc=Dies kann eine HTTP/HTTPS/GIT URL oder ein lokaler Serverpfad sein. migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=Ihnen fehlen die Rechte zum Importieren lokaler Repositories. migrate.permission_denied=Ihnen fehlen die Rechte zum Importieren lokaler Repositories.
migrate.invalid_local_path=Der lokale Pfad ist ungültig, existiert nicht oder ist kein Ordner. migrate.invalid_local_path=Der lokale Pfad ist ungültig, existiert nicht oder ist kein Ordner.
migrate.failed=Fehler bei Migration: %v migrate.failed=Fehler bei Migration: %v
@ -409,7 +414,7 @@ create_new_repo_command=Erstellen Sie ein neues Repository mittels der Kommandoz
push_exist_repo=Bestehendes Repository von der Kommandozeile pushen push_exist_repo=Bestehendes Repository von der Kommandozeile pushen
repo_is_empty=Dieses Repository ist leer. Bitte kommen Sie später wieder! repo_is_empty=Dieses Repository ist leer. Bitte kommen Sie später wieder!
code=Code files=Dateien
branch=Branch branch=Branch
tree=Struktur tree=Struktur
filter_branch_and_tag=Nach Branch oder Tag filtern filter_branch_and_tag=Nach Branch oder Tag filtern
@ -426,37 +431,39 @@ file_history=Verlauf
file_view_raw=Ansicht im Originalformat file_view_raw=Ansicht im Originalformat
file_permalink=Permalink file_permalink=Permalink
file_too_large=Diese Datei ist zu groß zum Anzeigen file_too_large=Diese Datei ist zu groß zum Anzeigen
video_not_supported_in_browser=Ihr Browser unterstützt HTML5 Video-Tags nicht.
editor.new_file=Neue Datei editor.new_file=Neue Datei
editor.upload_file=Datei hochladen editor.upload_file=Datei hochladen
editor.edit_file=Datei bearbeiten editor.edit_file=Datei bearbeiten
editor.preview_changes=Vorschau der Änderungen editor.preview_changes=Vorschau der Änderungen
editor.cannot_edit_non_text_files=Nicht-Text Dateien können nicht bearbeitet werden editor.cannot_edit_non_text_files=Nicht-Text Dateien können nicht bearbeitet werden
editor.edit_this_file=Diese Datei bearbeiten editor.edit_this_file=Datei bearbeiten
editor.must_be_on_a_branch=Du musst dich in einer Branch befinden um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen editor.must_be_on_a_branch=Sie müssen sich in einem Branch befinden, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen
editor.fork_before_edit=Um die Datei zu bearbeiten müssen Sie das Repository forken editor.fork_before_edit=Um die Datei zu bearbeiten, müssen Sie das Repository forken
editor.delete_this_file=Diese Datei löschen editor.delete_this_file=Datei löschen
editor.must_have_write_access=Du musst Schreibzugriff haben um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen editor.must_have_write_access=Du musst Schreibzugriff haben, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen
editor.file_delete_success=Die Datei '%s' wurde erfolgreich gelöscht! editor.file_delete_success=Die Datei '%s' wurde erfolgreich gelöscht!
editor.name_your_file=Dateinamen eingeben... editor.name_your_file=Dateinamen eingeben...
editor.filename_help=Um einen Ordner hinzuzufügen, gib den Namen ein und drücke /. Um einen Ordner zu entfernen, gehe zum Anfang des Feldes und drücke auf die Rücktaste. editor.filename_help=Um einen Ordner hinzuzufügen, gib den Namen ein und drücke /. Um einen Ordner zu entfernen, gehe zum Anfang des Feldes und drücke auf die Rücktaste.
editor.or=oder editor.or=oder
editor.cancel_lower=abbrechen editor.cancel_lower=abbrechen
editor.commit_changes=Änderungen im Commit editor.commit_changes=Änderungen einchecken
editor.add_tmpl=Hinzufügen von '%s/<filename>' editor.add_tmpl=Hinzufügen von '%s/<filename>'
editor.add='%s' hinzufügen editor.add='%s' hinzufügen
editor.update='%s' ändern editor.update='%s' ändern
editor.delete='%s' löschen editor.delete='%s' löschen
editor.commit_message_desc=Eine optionale, erweiterte Commit Beschreibung... editor.commit_message_desc=Eine ausführlichere Beschreibung kann hinzugefügt werden...
editor.commit_directly_to_this_branch=Änderungen direkt dem Branch <strong class="branch-name">%s</strong> hinzufügen. editor.commit_directly_to_this_branch=Direkt in den <strong class="branch-name">%s</strong> Branch einchecken.
editor.create_new_branch=Erstellen Sie einen <strong>neuen Branch</strong> für diesen Commit und starten Sie einen Pull Request. editor.create_new_branch=Einen <strong>neuen Branch</strong> für diesen Commit erstellen und einen Pull Request starten.
editor.new_branch_name_desc=Neuer Branch Name... editor.new_branch_name_desc=Neuer Branch Name...
editor.cancel=Abbrechen editor.cancel=Abbrechen
editor.filename_cannot_be_empty=Der Dateiname darf nicht leer sein. editor.filename_cannot_be_empty=Der Dateiname darf nicht leer sein.
editor.branch_already_exists=Branch '%s' existiert bereits in diesem Repository. editor.branch_already_exists=Branch '%s' existiert bereits in diesem Repository.
editor.directory_is_a_file='%s' im übergeordneten Verzeichnis ist eine Datei und kein Verzeichnis. editor.directory_is_a_file='%s' im übergeordneten Verzeichnis ist eine Datei und kein Verzeichnis.
editor.file_is_a_symlink=Die Datei '%s' ist ein Symlink die nicht im Webeditor verändert werden kann.
editor.filename_is_a_directory=Die Datei '%s' existiert bereits als Verzeichnis in diesem Repository. editor.filename_is_a_directory=Die Datei '%s' existiert bereits als Verzeichnis in diesem Repository.
editor.file_editing_no_longer_exists=Die Datei '%s' welche Sie bearbeiten existiert in diesem Repository nicht mehr. editor.file_editing_no_longer_exists=Die Datei '%s', welche Sie bearbeiten, existiert in diesem Repository nicht mehr.
editor.file_changed_while_editing=Seit dem Start der Bearbeitung hat sich die Datei geändert. <a target="_blank" href="%s">Hier klicken</a> um die Änderungen zu sehen, oder nochmals <strong>Commit drücken</strong> um die Änderungen zu überschreiben. editor.file_changed_while_editing=Seit dem Start der Bearbeitung hat sich die Datei geändert. <a target="_blank" href="%s">Hier klicken</a> um die Änderungen zu sehen, oder nochmals <strong>Commit drücken</strong> um die Änderungen zu überschreiben.
editor.file_already_exists=Eine Datei mit dem Namen '%s' existiert bereits in diesem Repository. editor.file_already_exists=Eine Datei mit dem Namen '%s' existiert bereits in diesem Repository.
editor.no_changes_to_show=Keine Änderungen vorhanden. editor.no_changes_to_show=Keine Änderungen vorhanden.
@ -536,7 +543,7 @@ issues.commit_ref_at=`hat dieses Issue <a id="%[1]s" href="#%[1]s">%[2]s</a> aus
issues.poster=Ersteller issues.poster=Ersteller
issues.collaborator=Mitarbeiter issues.collaborator=Mitarbeiter
issues.owner=Besitzer issues.owner=Besitzer
issues.sign_in_require_desc=<a href="%s">Anmelden</a> um an der Diskussion teilzunehmen. issues.sign_in_require_desc=<a href="%s">Anmelden</a>, um an der Diskussion teilzunehmen.
issues.edit=Bearbeiten issues.edit=Bearbeiten
issues.cancel=Abbrechen issues.cancel=Abbrechen
issues.save=Speichern issues.save=Speichern
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=Dieser Pull-Request kann nicht automatisch zusammen
pulls.cannot_auto_merge_helper=Bitte manuell zusammenführen, um die Konflikte zu lösen. pulls.cannot_auto_merge_helper=Bitte manuell zusammenführen, um die Konflikte zu lösen.
pulls.merge_pull_request=Pull-Request zusammenführen pulls.merge_pull_request=Pull-Request zusammenführen
pulls.open_unmerged_pull_exists=`Sie können diesen Pull-Request nicht wieder öffnen, da bereits ein offener Pull-Request (#%d) aus dem selben Repository mit den gleichen Merge-Informationen existiert und auf das Zusammenführen wartet.` pulls.open_unmerged_pull_exists=`Sie können diesen Pull-Request nicht wieder öffnen, da bereits ein offener Pull-Request (#%d) aus dem selben Repository mit den gleichen Merge-Informationen existiert und auf das Zusammenführen wartet.`
pulls.delete_branch=Zweig löschen
pulls.delete_branch_has_new_commits=Zweig kann nicht gelöscht werden, da er noch weitere Commits nach dem Zusammenführen enthält.
milestones.new=Neuer Meilenstein milestones.new=Neuer Meilenstein
milestones.open_tab=%d offen milestones.open_tab=%d offen
@ -720,8 +729,8 @@ settings.event_send_everything=Ich brauche <strong>alles</strong>.
settings.event_choose=Lass mich auswählen, was ich brauche. settings.event_choose=Lass mich auswählen, was ich brauche.
settings.event_create=Erstellen settings.event_create=Erstellen
settings.event_create_desc=Branch/Tag erstellt settings.event_create_desc=Branch/Tag erstellt
settings.event_pull_request=Pull Request settings.event_pull_request=Pull-Request
settings.event_pull_request_desc=Pull-Request geöffnet, geschlossen, wieder geöffnet, bearbeitet, nicht zugewiesen, Label aktualisiert, Label gelöscht oder nicht synchronisiert. settings.event_pull_request_desc=Pull-Request geöffnet, geschlossen, wieder geöffnet, bearbeitet, zugewiesen, nicht zugewiesen, Label aktualisiert, Label gelöscht oder synchronisiert.
settings.event_push=Push settings.event_push=Push
settings.event_push_desc=Git push auf ein Repository settings.event_push_desc=Git push auf ein Repository
settings.active=Aktiv settings.active=Aktiv
@ -1028,6 +1037,7 @@ auths.delete_auth_title=Authentifizierung löschen
auths.delete_auth_desc=Diese Authentifizierung wird gelöscht. Möchten Sie fortfahren? auths.delete_auth_desc=Diese Authentifizierung wird gelöscht. Möchten Sie fortfahren?
auths.still_in_used=Diese Authentifizierung wird noch von einigen Benutzern verwendet. Bitte löschen Sie diese Benutzer oder ändern Sie deren Anmeldetyp. auths.still_in_used=Diese Authentifizierung wird noch von einigen Benutzern verwendet. Bitte löschen Sie diese Benutzer oder ändern Sie deren Anmeldetyp.
auths.deletion_success=Authentifizierung wurde erfolgreich gelöscht! auths.deletion_success=Authentifizierung wurde erfolgreich gelöscht!
auths.login_source_exist=Login-Quelle '%s' ist bereits vorhanden.
config.server_config=Serverkonfiguration config.server_config=Serverkonfiguration
config.app_name=Name der Anwendung config.app_name=Name der Anwendung

18
conf/locale/locale_en-US.ini

@ -157,7 +157,6 @@ prohibit_login_desc = Your account is prohibited to login, please contact site a
resent_limit_prompt = Sorry, you already requested an activation email recently. Please wait 3 minutes then try again. resent_limit_prompt = Sorry, you already requested an activation email recently. Please wait 3 minutes then try again.
has_unconfirmed_mail = Hi %s, you have an unconfirmed email address (<b>%s</b>). If you haven't received a confirmation email or need to resend a new one, please click on the button below. has_unconfirmed_mail = Hi %s, you have an unconfirmed email address (<b>%s</b>). If you haven't received a confirmation email or need to resend a new one, please click on the button below.
resend_mail = Click here to resend your activation email resend_mail = Click here to resend your activation email
email_not_associate = This email address is not associated with any account.
send_reset_mail = Click here to (re)send your password reset email send_reset_mail = Click here to (re)send your password reset email
reset_password = Reset Your Password reset_password = Reset Your Password
invalid_code = Sorry, your confirmation code has expired or not valid. invalid_code = Sorry, your confirmation code has expired or not valid.
@ -338,6 +337,10 @@ access_token_deletion = Personal Access Token Deletion
access_token_deletion_desc = Delete this personal access token will remove all related accesses of application. Do you want to continue? access_token_deletion_desc = Delete this personal access token will remove all related accesses of application. Do you want to continue?
delete_token_success = Personal access token has been removed successfully! Don't forget to update your application as well. delete_token_success = Personal access token has been removed successfully! Don't forget to update your application as well.
orgs.none = You are not a member of any organizations.
orgs.leave_title = Leave an organization
orgs.leave_desc = You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account = Delete Your Account delete_account = Delete Your Account
delete_prompt = The operation will delete your account permanently, and <strong>CANNOT</strong> be undone! delete_prompt = The operation will delete your account permanently, and <strong>CANNOT</strong> be undone!
confirm_delete_account = Confirm Deletion confirm_delete_account = Confirm Deletion
@ -385,7 +388,8 @@ migrate_type = Migration Type
migrate_type_helper = This repository will be a <span class="text blue">mirror</span> migrate_type_helper = This repository will be a <span class="text blue">mirror</span>
migrate_repo = Migrate Repository migrate_repo = Migrate Repository
migrate.clone_address = Clone Address migrate.clone_address = Clone Address
migrate.clone_address_desc = This can be a HTTP/HTTPS/GIT URL or local server path. migrate.clone_address_desc = This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local = You're also allowed to migrate a repository by local server path.
migrate.permission_denied = You are not allowed to import local repositories. migrate.permission_denied = You are not allowed to import local repositories.
migrate.invalid_local_path = Invalid local path, it does not exist or not a directory. migrate.invalid_local_path = Invalid local path, it does not exist or not a directory.
migrate.failed = Migration failed: %v migrate.failed = Migration failed: %v
@ -410,7 +414,7 @@ create_new_repo_command = Create a new repository on the command line
push_exist_repo = Push an existing repository from the command line push_exist_repo = Push an existing repository from the command line
repo_is_empty = This repository is empty, please come back later! repo_is_empty = This repository is empty, please come back later!
code = Code files = Files
branch = Branch branch = Branch
tree = Tree tree = Tree
filter_branch_and_tag = Filter branch or tag filter_branch_and_tag = Filter branch or tag
@ -427,6 +431,7 @@ file_history = History
file_view_raw = View Raw file_view_raw = View Raw
file_permalink = Permalink file_permalink = Permalink
file_too_large = This file is too large to be shown file_too_large = This file is too large to be shown
video_not_supported_in_browser = Your browser doesn't support HTML5 video tag.
editor.new_file = New file editor.new_file = New file
editor.upload_file = Upload file editor.upload_file = Upload file
@ -456,6 +461,7 @@ editor.cancel = Cancel
editor.filename_cannot_be_empty = Filename cannot be empty. editor.filename_cannot_be_empty = Filename cannot be empty.
editor.branch_already_exists = Branch '%s' already exists in this repository. editor.branch_already_exists = Branch '%s' already exists in this repository.
editor.directory_is_a_file = Entry '%s' in the parent path is a file not a directory in this repository. editor.directory_is_a_file = Entry '%s' in the parent path is a file not a directory in this repository.
editor.file_is_a_symlink = The file '%s' is a symlink that cannot be modified from the web editor.
editor.filename_is_a_directory = The filename '%s' is an existing directory in this repository. editor.filename_is_a_directory = The filename '%s' is an existing directory in this repository.
editor.file_editing_no_longer_exists = The file '%s' you are editing no longer exists in the repository. editor.file_editing_no_longer_exists = The file '%s' you are editing no longer exists in the repository.
editor.file_changed_while_editing = File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes. editor.file_changed_while_editing = File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes.
@ -580,6 +586,8 @@ pulls.cannot_auto_merge_desc = This pull request can't be merged automatically b
pulls.cannot_auto_merge_helper = Please merge manually in order to resolve the conflicts. pulls.cannot_auto_merge_helper = Please merge manually in order to resolve the conflicts.
pulls.merge_pull_request = Merge Pull Request pulls.merge_pull_request = Merge Pull Request
pulls.open_unmerged_pull_exists = `You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.` pulls.open_unmerged_pull_exists = `You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.`
pulls.delete_branch = Delete Branch
pulls.delete_branch_has_new_commits = Branch cannot be deleted because it has new commits after mergence.
milestones.new = New Milestone milestones.new = New Milestone
milestones.open_tab = %d Open milestones.open_tab = %d Open
@ -648,6 +656,8 @@ settings.external_wiki_url_desc = Visitors will be redirected to URL when they c
settings.issues_desc = Enable issue tracker settings.issues_desc = Enable issue tracker
settings.use_internal_issue_tracker = Use builtin lightweight issue tracker settings.use_internal_issue_tracker = Use builtin lightweight issue tracker
settings.use_external_issue_tracker = Use external issue tracker settings.use_external_issue_tracker = Use external issue tracker
settings.external_tracker_url = External Issue Tracker URL
settings.external_tracker_url_desc = Visitors will be redirected to URL when they click on the tab.
settings.tracker_url_format = External Issue Tracker URL Format settings.tracker_url_format = External Issue Tracker URL Format
settings.tracker_issue_style = External Issue Tracker Naming Style: settings.tracker_issue_style = External Issue Tracker Naming Style:
settings.tracker_issue_style.numeric = Numeric settings.tracker_issue_style.numeric = Numeric
@ -887,7 +897,7 @@ first_page = First
last_page = Last last_page = Last
total = Total: %d total = Total: %d
dashboard.statistic = Statistic dashboard.statistic = Statistics
dashboard.operations = Operations dashboard.operations = Operations
dashboard.system_status = System Monitor Status dashboard.system_status = System Monitor Status
dashboard.statistic_info = Gogs database has <b>%d</b> users, <b>%d</b> organizations, <b>%d</b> public keys, <b>%d</b> repositories, <b>%d</b> watches, <b>%d</b> stars, <b>%d</b> actions, <b>%d</b> accesses, <b>%d</b> issues, <b>%d</b> comments, <b>%d</b> social accounts, <b>%d</b> follows, <b>%d</b> mirrors, <b>%d</b> releases, <b>%d</b> login sources, <b>%d</b> webhooks, <b>%d</b> milestones, <b>%d</b> labels, <b>%d</b> hook tasks, <b>%d</b> teams, <b>%d</b> update tasks, <b>%d</b> attachments. dashboard.statistic_info = Gogs database has <b>%d</b> users, <b>%d</b> organizations, <b>%d</b> public keys, <b>%d</b> repositories, <b>%d</b> watches, <b>%d</b> stars, <b>%d</b> actions, <b>%d</b> accesses, <b>%d</b> issues, <b>%d</b> comments, <b>%d</b> social accounts, <b>%d</b> follows, <b>%d</b> mirrors, <b>%d</b> releases, <b>%d</b> login sources, <b>%d</b> webhooks, <b>%d</b> milestones, <b>%d</b> labels, <b>%d</b> hook tasks, <b>%d</b> teams, <b>%d</b> update tasks, <b>%d</b> attachments.

136
conf/locale/locale_es-ES.ini

@ -25,7 +25,7 @@ captcha=Captcha
repository=Repositorio repository=Repositorio
organization=Organización organization=Organización
mirror=Mirror mirror=Réplica
new_repo=Nuevo repositorio new_repo=Nuevo repositorio
new_migrate=Nueva migración new_migrate=Nueva migración
new_mirror=Nueva réplica new_mirror=Nueva réplica
@ -137,6 +137,7 @@ issues.in_your_repos=En tus repositorios
[explore] [explore]
repos=Repositorios repos=Repositorios
users=Usuarios users=Usuarios
organizations=Organizaciones
search=Buscar search=Buscar
[auth] [auth]
@ -156,7 +157,6 @@ prohibit_login_desc=Su cuenta tiene prohibido ingresar al sistema, fovor contact
resent_limit_prompt=Lo sentimos, estás solicitando el reenvío del mail de activación con demasiada frecuencia. Por favor, espera 3 minutos. resent_limit_prompt=Lo sentimos, estás solicitando el reenvío del mail de activación con demasiada frecuencia. Por favor, espera 3 minutos.
has_unconfirmed_mail=Hola %s, tu correo electrónico (<b>%s</b>) no está confirmado. Si no has recibido un correo de confirmación o necesitas que lo enviemos de nuevo, por favor, haz click en el siguiente botón. has_unconfirmed_mail=Hola %s, tu correo electrónico (<b>%s</b>) no está confirmado. Si no has recibido un correo de confirmación o necesitas que lo enviemos de nuevo, por favor, haz click en el siguiente botón.
resend_mail=Haz click aquí para reenviar tu correo electrónico de activación resend_mail=Haz click aquí para reenviar tu correo electrónico de activación
email_not_associate=Esta dirección de correo electrónico no esta asociada a ninguna cuenta.
send_reset_mail=Haga clic aquí para (re)enviar el correo para el restablecimiento de la contraseña send_reset_mail=Haga clic aquí para (re)enviar el correo para el restablecimiento de la contraseña
reset_password=Restablecer su contraseña reset_password=Restablecer su contraseña
invalid_code=Lo sentimos, su código de confirmación ha expirado o no es valido. invalid_code=Lo sentimos, su código de confirmación ha expirado o no es valido.
@ -190,11 +190,11 @@ AuthName=Nombre de autorización
AdminEmail=Correo electrónico del administrador AdminEmail=Correo electrónico del administrador
NewBranchName=Nuevo nombre de rama NewBranchName=Nuevo nombre de rama
CommitSummary=Commit summary CommitSummary=Resumen del commit
CommitMessage=Commit message CommitMessage=Mensaje de commit
CommitChoice=Commit choice CommitChoice=Hacer commit de la elección
TreeName=File path TreeName=Ruta del archivo
Content=Content Content=Contenido
require_error=` no puede estar vacío.` require_error=` no puede estar vacío.`
alpha_dash_error=` los caracteres deben ser Alfanumericos o dash(-_).` alpha_dash_error=` los caracteres deben ser Alfanumericos o dash(-_).`
@ -337,6 +337,10 @@ access_token_deletion=Borrado de Token de Acceso Personal
access_token_deletion_desc=Si elimina este token de acceso personal la aplicación asociada perderá el permiso de acceso. ¿Desea continuar? access_token_deletion_desc=Si elimina este token de acceso personal la aplicación asociada perderá el permiso de acceso. ¿Desea continuar?
delete_token_success=¡El token de acceso personal ha sido eliminado con éxito! No se olvide de actualizar también las aplicaciones asociadas. delete_token_success=¡El token de acceso personal ha sido eliminado con éxito! No se olvide de actualizar también las aplicaciones asociadas.
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=Elimina tu cuenta delete_account=Elimina tu cuenta
delete_prompt=La operación eliminará tu cuenta de forma permanente y ¡<strong>NO</strong> se puede deshacer! delete_prompt=La operación eliminará tu cuenta de forma permanente y ¡<strong>NO</strong> se puede deshacer!
confirm_delete_account=Confirmar Eliminación confirm_delete_account=Confirmar Eliminación
@ -370,7 +374,7 @@ mirror_prune_desc=Remover referencias remotas que no existan remotamente
mirror_interval=Intervalo de la réplica (en horas) mirror_interval=Intervalo de la réplica (en horas)
mirror_address=Dirección de la réplica mirror_address=Dirección de la réplica
mirror_address_desc=Por favor, incluya las credenciales de usuario necesarias en la dirección. mirror_address_desc=Por favor, incluya las credenciales de usuario necesarias en la dirección.
mirror_last_synced=Last Synced mirror_last_synced=Última sincronización
watchers=Seguidores watchers=Seguidores
stargazers=Fans stargazers=Fans
forks=Forks forks=Forks
@ -384,7 +388,8 @@ migrate_type=Tipo de migración
migrate_type_helper=Este repositorio será una <span class="text blue">réplica</span> migrate_type_helper=Este repositorio será una <span class="text blue">réplica</span>
migrate_repo=Migrar Repositorio migrate_repo=Migrar Repositorio
migrate.clone_address=Clonar dirección migrate.clone_address=Clonar dirección
migrate.clone_address_desc=Puede ser una URL HTTP/HTTPS/GIT o una ruta local del servidor. migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=No te está permitido importar repositorios locales. migrate.permission_denied=No te está permitido importar repositorios locales.
migrate.invalid_local_path=Rutal local inválida, no existe o no es un directorio. migrate.invalid_local_path=Rutal local inválida, no existe o no es un directorio.
migrate.failed=Migración fallida: %v migrate.failed=Migración fallida: %v
@ -409,7 +414,7 @@ create_new_repo_command=Crear un nuevo repositorio desde línea de comandos
push_exist_repo=Hacer Push de un repositorio existente desde línea de comandos push_exist_repo=Hacer Push de un repositorio existente desde línea de comandos
repo_is_empty=Este repositorio está vacío, por favor, ¡vuelva más tarde! repo_is_empty=Este repositorio está vacío, por favor, ¡vuelva más tarde!
code=Código files=Files
branch=Rama branch=Rama
tree=Árbol tree=Árbol
filter_branch_and_tag=Filtrar por rama o etiqueta filter_branch_and_tag=Filtrar por rama o etiqueta
@ -426,47 +431,49 @@ file_history=Histórico
file_view_raw=Ver Raw file_view_raw=Ver Raw
file_permalink=Permalink file_permalink=Permalink
file_too_large=Este archivo es demasiado grande para ser mostrado file_too_large=Este archivo es demasiado grande para ser mostrado
video_not_supported_in_browser=Su navegador no soporta el tag video de HTML5.
editor.new_file=Nuevo archivo editor.new_file=Nuevo archivo
editor.upload_file=Upload file editor.upload_file=Subir archivo
editor.edit_file=Edit file editor.edit_file=Editar archivo
editor.preview_changes=Preview Changes editor.preview_changes=Vista previa de los cambios
editor.cannot_edit_non_text_files=Cannot edit non-text files editor.cannot_edit_non_text_files=Sólo puede editar archivos de texto
editor.edit_this_file=Edit this file editor.edit_this_file=Editar este archivo
editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file editor.must_be_on_a_branch=Debes estar en una rama para hacer o proponer cambios en este archivo
editor.fork_before_edit=You must fork this repository before editing the file editor.fork_before_edit=Debes hacer un fork de este repositorio antes de editar el archivo
editor.delete_this_file=Delete this file editor.delete_this_file=Eliminar este archivo
editor.must_have_write_access=You must have write access to make or propose changes to this file editor.must_have_write_access=Debes tener permisos de escritura para hacer o proponer cambios a este archivo
editor.file_delete_success=File '%s' has been deleted successfully! editor.file_delete_success=¡El archivo '%s' ha sido eliminado con éxito!
editor.name_your_file=Name your file... editor.name_your_file=Nombre de archivo...
editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. editor.filename_help=Para añadir un directorio, simplemente escribelo y presiona /. Para eliminar un directorio, ve al principio del campo y presiona retroceso.
editor.or=or editor.or=o
editor.cancel_lower=cancel editor.cancel_lower=cancelar
editor.commit_changes=Commit Changes editor.commit_changes=Hacer commit de los cambios
editor.add_tmpl=Add '%s/<filename>' editor.add_tmpl=Añadir '%s<filename>'
editor.add=Add '%s' editor.add=Añadir '%s'
editor.update=Update '%s' editor.update=Actualizar '%s'
editor.delete=Delete '%s' editor.delete=Eliminar '%s'
editor.commit_message_desc=Add an optional extended description... editor.commit_message_desc=Añadir una descripción extendida opcional...
editor.commit_directly_to_this_branch=Commit directly to the <strong class="branch-name">%s</strong> branch. editor.commit_directly_to_this_branch=Hacer commit directamente en la rama <strong class="branch-name">%s</strong>.
editor.create_new_branch=Create a <strong>new branch</strong> for this commit and start a pull request. editor.create_new_branch=Crear una <strong>nueva rama</strong> para este commit y hacer un pull request.
editor.new_branch_name_desc=New branch name... editor.new_branch_name_desc=Nombre de la rama nueva...
editor.cancel=Cancel editor.cancel=Cancelar
editor.filename_cannot_be_empty=Filename cannot be empty. editor.filename_cannot_be_empty=El nombre del archivo no puede estar vacío.
editor.branch_already_exists=Branch '%s' already exists in this repository. editor.branch_already_exists=La rama '%s' ya existe en este repositorio.
editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. editor.directory_is_a_file=La entrada '%s' en el directorio padre es un archivo no un directorio en este repositorio.
editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. editor.file_is_a_symlink=El archivo '%s' es un enlace simbólico que no puede ser modificado desde el editor de la web.
editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. editor.filename_is_a_directory=El nombre del fichero '%s' es un directorio existente en este repositorio.
editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes. editor.file_editing_no_longer_exists=El archivo '%s' que estás editando ya no existe en este repositorio.
editor.file_already_exists=A file with name '%s' already exists in this repository. editor.file_changed_while_editing=El contenido del archivo ha sido modificado desde que empezó a editarlo. <a target="_blank" href="%s">Clic aquí</a> para ver qué ha sido modificado o <strong>presiona confirmar de nuevo</strong> para sobrescribir estos cambios.
editor.no_changes_to_show=There are no changes to show. editor.file_already_exists=Ya existe un archivo con nombre '%s' en este repositorio.
editor.fail_to_update_file=Failed to update/create file '%s' with error: %v editor.no_changes_to_show=No existen cambios para mostrar.
editor.add_subdir=Add subdirectory... editor.fail_to_update_file=Error al actualizar/crear el archivo '%s', error: %v
editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v editor.add_subdir=Añadir subdirectorio...
editor.upload_files_to_dir=Upload files to '%s' editor.unable_to_upload_files=Error al subir archivos a '%s', error: %v
editor.upload_files_to_dir=Subir archivos a '%s'
commits.commits=Commits commits.commits=Commits
commits.search=Buscar Commits commits.search=Buscar commits
commits.find=Buscar commits.find=Buscar
commits.author=Autor commits.author=Autor
commits.message=Mensaje commits.message=Mensaje
@ -490,11 +497,11 @@ issues.create=Crear incidencia
issues.new_label=Nueva Etiqueta issues.new_label=Nueva Etiqueta
issues.new_label_placeholder=Nombre etiqueta... issues.new_label_placeholder=Nombre etiqueta...
issues.create_label=Crear etiqueta issues.create_label=Crear etiqueta
issues.label_templates.title=Load a predefined set of labels issues.label_templates.title=Carga un conjunto predefinido de etiquetas
issues.label_templates.info=There aren’t any labels yet. You can click on the "New Label" button above to create one or use a predefined set below. issues.label_templates.info=Tdavía no hay ninguna etiqueta. Puede hacer clic en el botón "Nueva etiqueta" para crear una o utilizar un conjunto predefinido abajo.
issues.label_templates.helper=Select a label set issues.label_templates.helper=Seleccionar un conjunto de etiquetas
issues.label_templates.use=Use this label set issues.label_templates.use=Usar este conjunto de etiquetas
issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v issues.label_templates.fail_to_load_file=Error al cargar el archivo de plantilla de etiqueta '%s': %v
issues.open_tab=%d abiertas issues.open_tab=%d abiertas
issues.close_tab=%d cerradas issues.close_tab=%d cerradas
issues.filter_label=Etiqueta issues.filter_label=Etiqueta
@ -536,7 +543,7 @@ issues.commit_ref_at=`mencionada esta incidencia en un commit <a id="%[1]s" href
issues.poster=Autor issues.poster=Autor
issues.collaborator=Colaborador issues.collaborator=Colaborador
issues.owner=Propietario issues.owner=Propietario
issues.sign_in_require_desc=<a href="%s">Sign in</a> to join this conversation. issues.sign_in_require_desc=<a href="%s"> Inicie sesión</a> para unirse a esta conversación.
issues.edit=Editar issues.edit=Editar
issues.cancel=Cancelar issues.cancel=Cancelar
issues.save=Guardar issues.save=Guardar
@ -551,8 +558,8 @@ issues.label_deletion=Borrado de Etiqueta
issues.label_deletion_desc=Al borrar la etiqueta su información será eliminada de todas las incidencias relacionadas. Desea continuar? issues.label_deletion_desc=Al borrar la etiqueta su información será eliminada de todas las incidencias relacionadas. Desea continuar?
issues.label_deletion_success=Etiqueta borrada con éxito! issues.label_deletion_success=Etiqueta borrada con éxito!
issues.num_participants=%d participantes issues.num_participants=%d participantes
issues.attachment.open_tab=`Click to see "%s" in a new tab` issues.attachment.open_tab='Haga clic para ver "%s" en una pestaña nueva'
issues.attachment.download=`Click to download "%s"` issues.attachment.download=`Haga clic para descargar "%s"`
pulls.new=Nuevo Pull Request pulls.new=Nuevo Pull Request
pulls.compare_changes=Comparar cambios pulls.compare_changes=Comparar cambios
@ -570,8 +577,8 @@ pulls.tab_conversation=Conversación
pulls.tab_commits=Commits pulls.tab_commits=Commits
pulls.tab_files=Archivos modificados pulls.tab_files=Archivos modificados
pulls.reopen_to_merge=Por favor reabra este Pull Request para proceder con la operación de fusionado. pulls.reopen_to_merge=Por favor reabra este Pull Request para proceder con la operación de fusionado.
pulls.merged=Fuisionado pulls.merged=Fusionado
pulls.has_merged=¡Este pull request se ha completado con éxito! pulls.has_merged=¡Este Pull Request se ha completado con éxito!
pulls.data_broken=Los datos de este pull request ya no están disponibles porque se ha eliminado la información del fork. pulls.data_broken=Los datos de este pull request ya no están disponibles porque se ha eliminado la información del fork.
pulls.is_checking=Se está procediendo a la búsqueda de conflictos, por favor actualice la página en unos momentos. pulls.is_checking=Se está procediendo a la búsqueda de conflictos, por favor actualice la página en unos momentos.
pulls.can_auto_merge_desc=Este Pull Request puede ser fusionado automáticamente. pulls.can_auto_merge_desc=Este Pull Request puede ser fusionado automáticamente.
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=Este Pull Request no puede ser fusionado automátic
pulls.cannot_auto_merge_helper=Por favor, fusiona manualmente para resolver los conflictos. pulls.cannot_auto_merge_helper=Por favor, fusiona manualmente para resolver los conflictos.
pulls.merge_pull_request=Fusionar Pull Request pulls.merge_pull_request=Fusionar Pull Request
pulls.open_unmerged_pull_exists=`Usted no puede realizar la operación de reapertura porque en estos momentos existe una solicitud de pull request (#%d) para el mismo repositorio con la misma información que se encuentra a la espera de aprobación` pulls.open_unmerged_pull_exists=`Usted no puede realizar la operación de reapertura porque en estos momentos existe una solicitud de pull request (#%d) para el mismo repositorio con la misma información que se encuentra a la espera de aprobación`
pulls.delete_branch=Eliminar la rama
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
milestones.new=Nuevo Milestone milestones.new=Nuevo Milestone
milestones.open_tab=%d abiertas milestones.open_tab=%d abiertas
@ -632,9 +641,9 @@ settings.collaboration.undefined=Indefinido
settings.hooks=Webhooks settings.hooks=Webhooks
settings.githooks=Git Hooks settings.githooks=Git Hooks
settings.basic_settings=Configuración Básica settings.basic_settings=Configuración Básica
settings.mirror_settings=Mirror Settings settings.mirror_settings=Configuración de réplica
settings.sync_mirror=Sync Now settings.sync_mirror=Sincronizar ahora
settings.mirror_sync_in_progress=Mirror syncing is in progress, please refresh page in about a minute. settings.mirror_sync_in_progress=Sincronización de réplica en curso, por favor actualice la página en unos minutos.
settings.site=Sitio oficial settings.site=Sitio oficial
settings.update_settings=Actualizar configuración settings.update_settings=Actualizar configuración
settings.change_reponame_prompt=Este cambio afectará a los enlaces al repositorio. settings.change_reponame_prompt=Este cambio afectará a los enlaces al repositorio.
@ -721,7 +730,7 @@ settings.event_choose=Déjeme elegir lo que necesito.
settings.event_create=Crear settings.event_create=Crear
settings.event_create_desc=Rama o etiqueta creada settings.event_create_desc=Rama o etiqueta creada
settings.event_pull_request=Pull Request settings.event_pull_request=Pull Request
settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. settings.event_pull_request_desc=Pull request, abierta, cerrada, reabierta, editada, asignada, desasignada, con etiqueta actualizada, con etiqueta eliminada, o sincronizada.
settings.event_push=Push settings.event_push=Push
settings.event_push_desc=Git push a un repositorio settings.event_push_desc=Git push a un repositorio
settings.active=Activo settings.active=Activo
@ -1028,6 +1037,7 @@ auths.delete_auth_title=Borrado de autenticación
auths.delete_auth_desc=Esta autenticación será eliminada. ¿Deseas continuar? auths.delete_auth_desc=Esta autenticación será eliminada. ¿Deseas continuar?
auths.still_in_used=Este método de autentificación aún es utilizado por algunos usuarios, por favor elimine o convierta estos usuarios a otro tipo de autentificación. auths.still_in_used=Este método de autentificación aún es utilizado por algunos usuarios, por favor elimine o convierta estos usuarios a otro tipo de autentificación.
auths.deletion_success=¡La autenticación ha sido eliminada con éxito! auths.deletion_success=¡La autenticación ha sido eliminada con éxito!
auths.login_source_exist=Login source '%s' already exists.
config.server_config=Configuración del servidor config.server_config=Configuración del servidor
config.app_name=Nombre de la Aplicación config.app_name=Nombre de la Aplicación
@ -1122,7 +1132,7 @@ config.git_max_diff_line_characters=Carácteres de Diff máximos (para una sola
config.git_max_diff_files=Máximo de archivos de Diff (que se mostrarán) config.git_max_diff_files=Máximo de archivos de Diff (que se mostrarán)
config.git_gc_args=Argumentos de GC config.git_gc_args=Argumentos de GC
config.git_migrate_timeout=Tiempo de espera de migración config.git_migrate_timeout=Tiempo de espera de migración
config.git_mirror_timeout=Tiempo de espera de actualización de espejos config.git_mirror_timeout=Tiempo de espera de actualización de réplicas
config.git_clone_timeout=Tiempo de espera de operación de clones config.git_clone_timeout=Tiempo de espera de operación de clones
config.git_pull_timeout=Tiempo de espera de operación de pull config.git_pull_timeout=Tiempo de espera de operación de pull
config.git_gc_timeout=Tiempo de espera de operación de GC config.git_gc_timeout=Tiempo de espera de operación de GC
@ -1188,7 +1198,7 @@ hours=%[2]s %[1]d horas
days=%[2]s %[1]d días days=%[2]s %[1]d días
weeks=%[2]s %[1]d semanas weeks=%[2]s %[1]d semanas
months=%[2]s %[1]d meses months=%[2]s %[1]d meses
years=%s %d años years=%[2]s %[1]d años
raw_seconds=segundos raw_seconds=segundos
raw_minutes=minutos raw_minutes=minutos

60
conf/locale/locale_fi-FI.ini

@ -136,8 +136,9 @@ issues.in_your_repos=Repoissasi
[explore] [explore]
repos=Repot repos=Repot
users=Users users=Käyttäjät
search=Search organizations=Organisaatiot
search=Hae
[auth] [auth]
create_new_account=Luo uusi tili create_new_account=Luo uusi tili
@ -151,12 +152,11 @@ forget_password=Unohtuiko salasana?
sign_up_now=Tarvitsetko tilin? Rekisteröidy nyt. sign_up_now=Tarvitsetko tilin? Rekisteröidy nyt.
confirmation_mail_sent_prompt=Uusi varmistus sähköposti on lähetetty osoitteeseen <b>%s</b>, ole hyvä ja tarkista saapuneet seuraavan %d tunnin sisällä saadaksesi rekisteröintiprosessin valmiiksi. confirmation_mail_sent_prompt=Uusi varmistus sähköposti on lähetetty osoitteeseen <b>%s</b>, ole hyvä ja tarkista saapuneet seuraavan %d tunnin sisällä saadaksesi rekisteröintiprosessin valmiiksi.
active_your_account=Aktivoi tilisi active_your_account=Aktivoi tilisi
prohibit_login=Login Prohibited prohibit_login=Kirjautuminen kielletty
prohibit_login_desc=Your account is prohibited to login, please contact site admin. prohibit_login_desc=Your account is prohibited to login, please contact site admin.
resent_limit_prompt=Sori, olet jo tilannut aktivointi sähköpostin lähiaikoina. Ole hyvä ja odota 3 minuuttia ja yritä sitten uudelleen. resent_limit_prompt=Sori, olet jo tilannut aktivointi sähköpostin lähiaikoina. Ole hyvä ja odota 3 minuuttia ja yritä sitten uudelleen.
has_unconfirmed_mail=Hei %s, sinulla on varmistamaton sähköposti osoite (<b>%s</b>). Jos et ole saanut varmistus sähköpostia tai tarvitset uudelleenlähetyksen, ole hyvä ja klikkaa allaolevaa painiketta. has_unconfirmed_mail=Hei %s, sinulla on varmistamaton sähköposti osoite (<b>%s</b>). Jos et ole saanut varmistus sähköpostia tai tarvitset uudelleenlähetyksen, ole hyvä ja klikkaa allaolevaa painiketta.
resend_mail=Klikkaa tästä uudelleenlähettääksesi aktivointi sähköpostisi resend_mail=Klikkaa tästä uudelleenlähettääksesi aktivointi sähköpostisi
email_not_associate=Tätä sähköposti osoitetta ei ole liitetty mihinkään tiliin.
send_reset_mail=Klikkaa tästä (uudelleen)lähettääksesi salasanan nollaus sähköpostin send_reset_mail=Klikkaa tästä (uudelleen)lähettääksesi salasanan nollaus sähköpostin
reset_password=Nollaa salasanasi reset_password=Nollaa salasanasi
invalid_code=Sori, varmistuskoodisi on vanhentunut tai väärä. invalid_code=Sori, varmistuskoodisi on vanhentunut tai väärä.
@ -193,8 +193,8 @@ NewBranchName=New branch name
CommitSummary=Commit summary CommitSummary=Commit summary
CommitMessage=Commit message CommitMessage=Commit message
CommitChoice=Commit choice CommitChoice=Commit choice
TreeName=File path TreeName=Tiedostopolku
Content=Content Content=Sisältö
require_error=` ei voi olla tyhjä.` require_error=` ei voi olla tyhjä.`
alpha_dash_error=` täytyy olla kirjaimia tai numeroita tai väliviiva(-_) merkkejä.` alpha_dash_error=` täytyy olla kirjaimia tai numeroita tai väliviiva(-_) merkkejä.`
@ -337,6 +337,10 @@ access_token_deletion=Henkilökohtaisen pääsymerkin poisto
access_token_deletion_desc=Tämän henkilökohtaisen pääsymerkin poistaminen poistaa kaikki siihen liittyvät pääsyt sovellukseen. Haluatko jatkaa? access_token_deletion_desc=Tämän henkilökohtaisen pääsymerkin poistaminen poistaa kaikki siihen liittyvät pääsyt sovellukseen. Haluatko jatkaa?
delete_token_success=Henkilökohtainen pääsymerkki on poistettu onnistuneesti! Älä unohda päivittää sovellustasi myös. delete_token_success=Henkilökohtainen pääsymerkki on poistettu onnistuneesti! Älä unohda päivittää sovellustasi myös.
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=Poista tilisi delete_account=Poista tilisi
delete_prompt=Toiminto poistaa tilisi pysyvästi ja tätä <strong>EI VOI</strong> peruuttaa myöhemmin! delete_prompt=Toiminto poistaa tilisi pysyvästi ja tätä <strong>EI VOI</strong> peruuttaa myöhemmin!
confirm_delete_account=Varmista poisto confirm_delete_account=Varmista poisto
@ -384,7 +388,8 @@ migrate_type=Siirtotyyppi
migrate_type_helper=Tämä repo tulee olemaan <span class="text blue">peili</span> migrate_type_helper=Tämä repo tulee olemaan <span class="text blue">peili</span>
migrate_repo=Siirrä repo migrate_repo=Siirrä repo
migrate.clone_address=Kloonaa osoite migrate.clone_address=Kloonaa osoite
migrate.clone_address_desc=Tämä voi olla HTTP/HTTPS/GIT URL tai paikallisen palvelimen polku. migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=Sinun ei sallita tuovan paikallisia repoja. migrate.permission_denied=Sinun ei sallita tuovan paikallisia repoja.
migrate.invalid_local_path=Virheellinen paikallinen polku, ei ole olemassa tai ei ole hakemisto. migrate.invalid_local_path=Virheellinen paikallinen polku, ei ole olemassa tai ei ole hakemisto.
migrate.failed=Siirto epäonnistui: %v migrate.failed=Siirto epäonnistui: %v
@ -409,7 +414,7 @@ create_new_repo_command=Luo uusi repo komentoriviltä
push_exist_repo=Työnnä olemassaoleva repo komentoriviltä push_exist_repo=Työnnä olemassaoleva repo komentoriviltä
repo_is_empty=Tämä repo on tyhjä, ole hyvä ja tule takaisin myöhemmin! repo_is_empty=Tämä repo on tyhjä, ole hyvä ja tule takaisin myöhemmin!
code=Koodi files=Files
branch=Branch branch=Branch
tree=Puu tree=Puu
filter_branch_and_tag=Suodata haara tai tagi filter_branch_and_tag=Suodata haara tai tagi
@ -426,35 +431,37 @@ file_history=Historia
file_view_raw=Näytä raaka file_view_raw=Näytä raaka
file_permalink=Pysyvä linkki file_permalink=Pysyvä linkki
file_too_large=This file is too large to be shown file_too_large=This file is too large to be shown
video_not_supported_in_browser=Your browser doesn't support HTML5 video tag.
editor.new_file=New file editor.new_file=Uusi tiedosto
editor.upload_file=Upload file editor.upload_file=Liitä tiedosto
editor.edit_file=Edit file editor.edit_file=Muokkaa tiedostoa
editor.preview_changes=Preview Changes editor.preview_changes=Muutosten esikatselu
editor.cannot_edit_non_text_files=Cannot edit non-text files editor.cannot_edit_non_text_files=Cannot edit non-text files
editor.edit_this_file=Edit this file editor.edit_this_file=Edit this file
editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file
editor.fork_before_edit=You must fork this repository before editing the file editor.fork_before_edit=You must fork this repository before editing the file
editor.delete_this_file=Delete this file editor.delete_this_file=Poista tämä tiedosto
editor.must_have_write_access=You must have write access to make or propose changes to this file editor.must_have_write_access=Sinulla on kirjoitusoikeus tai ehdottaa muutoksia tiedostoon
editor.file_delete_success=File '%s' has been deleted successfully! editor.file_delete_success=Tiedosto "%s" on poistettu onnistuneesti!
editor.name_your_file=Name your file... editor.name_your_file=Nimeä tiedostosi...
editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. editor.filename_help=Lisää hakemisto, kirjoita se ja paina /. Poista hakemisto, siirry kentän alkuun ja paina ASKELPALAUTINTA.
editor.or=or editor.or=tai
editor.cancel_lower=cancel editor.cancel_lower=peruuta
editor.commit_changes=Commit Changes editor.commit_changes=Vahvista muutokset
editor.add_tmpl=Add '%s/<filename>' editor.add_tmpl=Lisää '%s/<filename>'
editor.add=Add '%s' editor.add=Lisää "%s"
editor.update=Update '%s' editor.update=Päivitä '%s'
editor.delete=Delete '%s' editor.delete=Poista "%s"
editor.commit_message_desc=Add an optional extended description... editor.commit_message_desc=Add an optional extended description...
editor.commit_directly_to_this_branch=Commit directly to the <strong class="branch-name">%s</strong> branch. editor.commit_directly_to_this_branch=Commit directly to the <strong class="branch-name">%s</strong> branch.
editor.create_new_branch=Create a <strong>new branch</strong> for this commit and start a pull request. editor.create_new_branch=Create a <strong>new branch</strong> for this commit and start a pull request.
editor.new_branch_name_desc=New branch name... editor.new_branch_name_desc=New branch name...
editor.cancel=Cancel editor.cancel=Peruuta
editor.filename_cannot_be_empty=Filename cannot be empty. editor.filename_cannot_be_empty=Filename cannot be empty.
editor.branch_already_exists=Branch '%s' already exists in this repository. editor.branch_already_exists=Branch '%s' already exists in this repository.
editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository.
editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor.
editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository.
editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository.
editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes. editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes.
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=Tätä pull-pyyntöä ei voi yhdistää automaattis
pulls.cannot_auto_merge_helper=Ole hyvä ja yhdistä manuaalisesti konfliktien ratkaisemiseksi. pulls.cannot_auto_merge_helper=Ole hyvä ja yhdistä manuaalisesti konfliktien ratkaisemiseksi.
pulls.merge_pull_request=Yhdistä Pull-pyyntö pulls.merge_pull_request=Yhdistä Pull-pyyntö
pulls.open_unmerged_pull_exists=`Et voi suorittaa uudelleenavaus toimintoa koska on jo olemassa pull-pyyntö (#%d) samasta reposta samoilla yhdistämistiedoilla ja odottaa yhdistämistä.` pulls.open_unmerged_pull_exists=`Et voi suorittaa uudelleenavaus toimintoa koska on jo olemassa pull-pyyntö (#%d) samasta reposta samoilla yhdistämistiedoilla ja odottaa yhdistämistä.`
pulls.delete_branch=Delete Branch
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
milestones.new=Uusi merkkipaalu milestones.new=Uusi merkkipaalu
milestones.open_tab=%d avoinna milestones.open_tab=%d avoinna
@ -1028,6 +1037,7 @@ auths.delete_auth_title=Todennuksen poistaminen
auths.delete_auth_desc=Tämä todennus poistetaan, haluatko jatkaa? auths.delete_auth_desc=Tämä todennus poistetaan, haluatko jatkaa?
auths.still_in_used=Tämä todennus on yhä joidenkin käyttäjien käytössä, ole hyvä ja poista tai muunna nämä käyttäjät toiselle kirjaututumistyypille ensin. auths.still_in_used=Tämä todennus on yhä joidenkin käyttäjien käytössä, ole hyvä ja poista tai muunna nämä käyttäjät toiselle kirjaututumistyypille ensin.
auths.deletion_success=Todennus on poistettu onnistuneesti! auths.deletion_success=Todennus on poistettu onnistuneesti!
auths.login_source_exist=Login source '%s' already exists.
config.server_config=Palvelin asetukset config.server_config=Palvelin asetukset
config.app_name=Sovellus nimi config.app_name=Sovellus nimi

44
conf/locale/locale_fr-FR.ini

@ -115,16 +115,16 @@ test_git_failed=Le test de la commande "git" a échoué : %v
sqlite3_not_available=Votre version publiée ne prend pas en charge SQLite3. Veuillez télécharger la version binaire officielle à cette adresse %s. sqlite3_not_available=Votre version publiée ne prend pas en charge SQLite3. Veuillez télécharger la version binaire officielle à cette adresse %s.
invalid_db_setting=Paramètres de base de données incorrects : %v invalid_db_setting=Paramètres de base de données incorrects : %v
invalid_repo_path=Chemin vers la racine du dépôt invalide : %v invalid_repo_path=Chemin vers la racine du dépôt invalide : %v
run_user_not_match=L'utilisateur entré n'est pas l'utilisateur actuel : %s -> %s run_user_not_match=L'utilisateur d'exécution saisi n'est pas l'utilisateur d'exécution actuel : %s -> %s
save_config_failed=La sauvegarde de la configuration a échoué : %v save_config_failed=La sauvegarde de la configuration a échoué : %v
invalid_admin_setting=Paramètres du compte administrateur invalides : %v invalid_admin_setting=Paramètres du compte administrateur invalides : %v
install_success=Bienvenue ! Nous sommes heureux que vous ayez choisi Gogs, amusez-vous et prenez soin de vous. install_success=Bienvenue ! Nous sommes heureux que vous ayez choisi Gogs, amusez-vous et prenez soin de vous.
invalid_log_root_path=Le chemin principal des fichiers logs est invalide: %v invalid_log_root_path=L'emplacement racine des fichiers logs est invalide : %v
[home] [home]
uname_holder=Nom d'utilisateur ou e-mail uname_holder=Nom d'utilisateur ou e-mail
password_holder=Mot de passe password_holder=Mot de passe
switch_dashboard_context=Basculer le Contexte du Tableau de Bord switch_dashboard_context=Basculer le contexte du tableau de bord
my_repos=Mes dépôts my_repos=Mes dépôts
show_more_repos=Afficher plus de dépôts... show_more_repos=Afficher plus de dépôts...
collaborative_repos=Dépôts collaboratifs collaborative_repos=Dépôts collaboratifs
@ -137,6 +137,7 @@ issues.in_your_repos=Dans vos dépôts
[explore] [explore]
repos=Dépôts repos=Dépôts
users=Utilisateurs users=Utilisateurs
organizations=Organisations
search=Rechercher search=Rechercher
[auth] [auth]
@ -144,7 +145,7 @@ create_new_account=Créer un nouveau compte
register_hepler_msg=Déjà enregistré ? Connectez-vous ! register_hepler_msg=Déjà enregistré ? Connectez-vous !
social_register_hepler_msg=Déjà enregistré ? Associez-le ! social_register_hepler_msg=Déjà enregistré ? Associez-le !
disable_register_prompt=Désolé, les enregistrements ont été désactivés. Veuillez contacter l'administrateur du site. disable_register_prompt=Désolé, les enregistrements ont été désactivés. Veuillez contacter l'administrateur du site.
disable_register_mail=Désolé, la Confirmation par Mail des Enregistrements a été désactivée. disable_register_mail=Désolé, la confirmation par e-mail des enregistrements a été désactivée.
remember_me=Se souvenir de moi remember_me=Se souvenir de moi
forgot_password=Mot de passe oublié forgot_password=Mot de passe oublié
forget_password=Mot de passe oublié ? forget_password=Mot de passe oublié ?
@ -156,19 +157,18 @@ prohibit_login_desc=Votre compte est interdit de se connecter, contactez l’adm
resent_limit_prompt=Désolé, vos tentatives d'activation sont trop fréquentes. Veuillez réessayer dans 3 minutes. resent_limit_prompt=Désolé, vos tentatives d'activation sont trop fréquentes. Veuillez réessayer dans 3 minutes.
has_unconfirmed_mail=Bonjour %s, votre adresse e-mail (<b>%s</b>) n'a pas été confirmée. Si vous n'avez reçu aucun mail de confirmation ou souhaitez renouveler l'envoi, cliquez sur le bouton ci-dessous. has_unconfirmed_mail=Bonjour %s, votre adresse e-mail (<b>%s</b>) n'a pas été confirmée. Si vous n'avez reçu aucun mail de confirmation ou souhaitez renouveler l'envoi, cliquez sur le bouton ci-dessous.
resend_mail=Cliquez ici pour renvoyer un mail de confirmation resend_mail=Cliquez ici pour renvoyer un mail de confirmation
email_not_associate=Cette adresse e-mail n'est associée à aucun compte.
send_reset_mail=Cliquez ici pour (r)envoyer le mail de réinitialisation du mot de passe send_reset_mail=Cliquez ici pour (r)envoyer le mail de réinitialisation du mot de passe
reset_password=Réinitialiser le mot de passe reset_password=Réinitialiser le mot de passe
invalid_code=Désolé, votre code de confirmation est invalide ou a expiré. invalid_code=Désolé, votre code de confirmation est invalide ou a expiré.
reset_password_helper=Cliquez ici pour réinitialiser votre mot de passe reset_password_helper=Cliquez ici pour réinitialiser votre mot de passe
password_too_short=Le mot de passe doit contenir 6 caractères minimum. password_too_short=Le mot de passe doit contenir 6 caractères minimum.
non_local_account=Les comptes non-locaux ne peuvent pas changer leur mot de passe via Gogs. non_local_account=Les comptes non locaux ne peuvent pas changer leur mot de passe via Gogs.
[mail] [mail]
activate_account=Veuillez activer votre compte activate_account=Veuillez activer votre compte
activate_email=Veuillez vérifier votre adresse e-mail activate_email=Veuillez vérifier votre adresse e-mail
reset_password=Réinitialiser votre mot de passe reset_password=Réinitialiser votre mot de passe
register_success=Succès de l'enregistrement, Bienvenue register_success=Inscription réussie, bienvenue
register_notify=Bienvenue à bord register_notify=Bienvenue à bord
[modal] [modal]
@ -179,13 +179,13 @@ modify=Modifier
[form] [form]
UserName=Nom d'utilisateur UserName=Nom d'utilisateur
RepoName=Nom du dépôt RepoName=Nom du dépôt
Email=Adresse E-mail Email=Adresse e-mail
Password=Mot de passe Password=Mot de passe
Retype=Confirmez le mot de passe Retype=Confirmez le mot de passe
SSHTitle=Nom de la clé SSH SSHTitle=Nom de la clé SSH
HttpsUrl=URL HTTPS HttpsUrl=URL HTTPS
PayloadUrl=URL des Données Utiles PayloadUrl=URL des données utiles
TeamName=Nom d'équipe TeamName=Nom de l'équipe
AuthName=Nom d'autorisation AuthName=Nom d'autorisation
AdminEmail=E-mail de l'administrateur AdminEmail=E-mail de l'administrateur
@ -196,9 +196,9 @@ CommitChoice=Choix de commit
TreeName=Chemin du fichier TreeName=Chemin du fichier
Content=Contenu Content=Contenu
require_error=` Ne peut être vide ` require_error=` ne peut pas être vide.`
alpha_dash_error=` doivent être des caractères alpha, numeriques ou console (-_) valides ` alpha_dash_error=` doivent être des caractères alpha, numériques ou tirets (-_) valides.`
alpha_dash_dot_error=` doivent être des caractères alpha, numeriques, console (-_) valides ou des points ` alpha_dash_dot_error=` doivent être des caractères alpha, numériques, tirets (-_) valides ou des points.`
size_error=` doit être à la taille de %s.` size_error=` doit être à la taille de %s.`
min_size_error=` %s caractères minimum ` min_size_error=` %s caractères minimum `
max_size_error=` %s caractères maximum ` max_size_error=` %s caractères maximum `
@ -337,6 +337,10 @@ access_token_deletion=Suppression du jeton d'accès
access_token_deletion_desc=Supprimer ce jeton d'accès supprimera tous les accès de l'application. Voulez-vous continuer ? access_token_deletion_desc=Supprimer ce jeton d'accès supprimera tous les accès de l'application. Voulez-vous continuer ?
delete_token_success=Le jeton d'accèsa été supprimé avec succès ! N'oubliez pas de mettre à jour vos applications. delete_token_success=Le jeton d'accèsa été supprimé avec succès ! N'oubliez pas de mettre à jour vos applications.
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=Supprimer votre compte delete_account=Supprimer votre compte
delete_prompt=Votre compte sera définitivement supprimé et cette opération est <strong>irréversible</strong> ! delete_prompt=Votre compte sera définitivement supprimé et cette opération est <strong>irréversible</strong> !
confirm_delete_account=Confirmer la suppression confirm_delete_account=Confirmer la suppression
@ -384,7 +388,8 @@ migrate_type=Type de migration
migrate_type_helper=Ce dépôt sera un <span class="text blue"> miroir</span> migrate_type_helper=Ce dépôt sera un <span class="text blue"> miroir</span>
migrate_repo=Migrer le dépôt migrate_repo=Migrer le dépôt
migrate.clone_address=Adresse du clone migrate.clone_address=Adresse du clone
migrate.clone_address_desc=Cela peut être une URL HTTP/HTTPS/GIT ou un chemin d'accès local. migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=Vous n'êtes pas autorisé à importer des dépôts locaux. migrate.permission_denied=Vous n'êtes pas autorisé à importer des dépôts locaux.
migrate.invalid_local_path=Chemin local non valide, non existant ou n'étant pas un dossier. migrate.invalid_local_path=Chemin local non valide, non existant ou n'étant pas un dossier.
migrate.failed=Echec de migration: %v migrate.failed=Echec de migration: %v
@ -409,7 +414,7 @@ create_new_repo_command=Créer un nouveau dépôt en ligne de commande
push_exist_repo=Soumettre un dépôt existant par ligne de commande push_exist_repo=Soumettre un dépôt existant par ligne de commande
repo_is_empty=Ce dépôt est vide, veuillez revenir plus tard ! repo_is_empty=Ce dépôt est vide, veuillez revenir plus tard !
code=Code files=Files
branch=Branche branch=Branche
tree=Aborescence tree=Aborescence
filter_branch_and_tag=Filtrer une branche ou un tag filter_branch_and_tag=Filtrer une branche ou un tag
@ -426,6 +431,7 @@ file_history=Historique
file_view_raw=Voir le Raw file_view_raw=Voir le Raw
file_permalink=Lien permanent file_permalink=Lien permanent
file_too_large=Ce fichier est trop gros pour être afficher file_too_large=Ce fichier est trop gros pour être afficher
video_not_supported_in_browser=Votre navigateur ne supporte pas la balise video HTML5.
editor.new_file=Nouveau fichier editor.new_file=Nouveau fichier
editor.upload_file=Téléverser un fichier editor.upload_file=Téléverser un fichier
@ -455,6 +461,7 @@ editor.cancel=Annuler
editor.filename_cannot_be_empty=Nom de fichier ne peut pas être vide. editor.filename_cannot_be_empty=Nom de fichier ne peut pas être vide.
editor.branch_already_exists=La branche '%s' existe déjà dans ce dépôt. editor.branch_already_exists=La branche '%s' existe déjà dans ce dépôt.
editor.directory_is_a_file=L'entrée '%s' dans le chemin d’accès parent est un fichier pas un répertoire dans ce dépôt. editor.directory_is_a_file=L'entrée '%s' dans le chemin d’accès parent est un fichier pas un répertoire dans ce dépôt.
editor.file_is_a_symlink=Le fichier « %s » est un lien symbolique qui ne peut être modifié depuis l'éditeur web.
editor.filename_is_a_directory=Le nom de fichier '%s' existe déjà dans ce dépot. editor.filename_is_a_directory=Le nom de fichier '%s' existe déjà dans ce dépot.
editor.file_editing_no_longer_exists=Le fichier '%s' que vous modifiez n'existe plus dans le dépôt. editor.file_editing_no_longer_exists=Le fichier '%s' que vous modifiez n'existe plus dans le dépôt.
editor.file_changed_while_editing=Le contenu du fichier à changé depuis que vous avez commencé à l'éditer. <a target="_blank" href="%s">Cliquez ici</a> pour voir ce qui à été modifié ou <strong>appuyez sur commit encore une fois</strong> pour remplacer ces changements. editor.file_changed_while_editing=Le contenu du fichier à changé depuis que vous avez commencé à l'éditer. <a target="_blank" href="%s">Cliquez ici</a> pour voir ce qui à été modifié ou <strong>appuyez sur commit encore une fois</strong> pour remplacer ces changements.
@ -530,7 +537,7 @@ issues.close_comment_issue=Commenter et fermer
issues.reopen_issue=Réouvrir issues.reopen_issue=Réouvrir
issues.reopen_comment_issue=Commenter et réouvrir issues.reopen_comment_issue=Commenter et réouvrir
issues.create_comment=Créer un commentaire issues.create_comment=Créer un commentaire
issues.closed_at=`fermé à <a id="%[1]s"href="#%[1]s"> %[2]s"</a>` issues.closed_at=`fermé à <a id="%[1]s"href="#%[1]s"> %[2]s</a>`
issues.reopened_at=`réouvert à <a id="%[1]s" href="#%[1]s"> %[2]s</a>` issues.reopened_at=`réouvert à <a id="%[1]s" href="#%[1]s"> %[2]s</a>`
issues.commit_ref_at=`a référencé ce problème à partir d'un commit <a id="%[1]s" href="#%[1]s"> %[2]s</a>` issues.commit_ref_at=`a référencé ce problème à partir d'un commit <a id="%[1]s" href="#%[1]s"> %[2]s</a>`
issues.poster=Publier issues.poster=Publier
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=Cette pull request ne peut être fusionnée automat
pulls.cannot_auto_merge_helper=Fusionner manuellement afin de résoudre les conflits. pulls.cannot_auto_merge_helper=Fusionner manuellement afin de résoudre les conflits.
pulls.merge_pull_request=Fusionner la Pull Request pulls.merge_pull_request=Fusionner la Pull Request
pulls.open_unmerged_pull_exists=`Vous ne pouvez effectuer une réouverture car il y a déjà une pull-request ouverte (#%d) depuis le même dépôt avec les mêmes informations de fusion et est en attente de fusion.` pulls.open_unmerged_pull_exists=`Vous ne pouvez effectuer une réouverture car il y a déjà une pull-request ouverte (#%d) depuis le même dépôt avec les mêmes informations de fusion et est en attente de fusion.`
pulls.delete_branch=Supprimer la branche
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
milestones.new=Nouveau Jalon milestones.new=Nouveau Jalon
milestones.open_tab=%d Ouvert milestones.open_tab=%d Ouvert
@ -1028,6 +1037,7 @@ auths.delete_auth_title=Suppression de l'authentification
auths.delete_auth_desc=Cette authentification va être supprimée. voulez-vous continuer ? auths.delete_auth_desc=Cette authentification va être supprimée. voulez-vous continuer ?
auths.still_in_used=Cette authentification est encore utilisée par d'autres utilisateurs, supprimez-les ou convertir ces utilisateurs vers un autre type de session, avant. auths.still_in_used=Cette authentification est encore utilisée par d'autres utilisateurs, supprimez-les ou convertir ces utilisateurs vers un autre type de session, avant.
auths.deletion_success=L'authentification a été supprimée avec succès ! auths.deletion_success=L'authentification a été supprimée avec succès !
auths.login_source_exist=La source de connexion « %s » existe déjà.
config.server_config=Configuration du Serveur config.server_config=Configuration du Serveur
config.app_name=Nom de l'application config.app_name=Nom de l'application
@ -1158,7 +1168,7 @@ notices.delete_success=Notifications système supprimées avec succès.
[action] [action]
create_repo=a créé le dépôt <a href="%s">%s</a> create_repo=a créé le dépôt <a href="%s">%s</a>
rename_repo=a rebaptisé le dépôt de <code>%[1]s</code> vers <a href="%[2]s">%[3]s</a> rename_repo=a rebaptisé le dépôt de <code>%[1]s</code> vers <a href="%[2]s">%[3]s</a>
commit_repo=a soumis à <a href="%[1]s/src/%[2]s">%[3]s</a> sur <a href="%[1]s">%[4]s</a> commit_repo=a commité dans <a href="%[1]s/src/%[2]s">%[3]s</a> sur <a href="%[1]s">%[4]s</a>
create_issue=`a ouvert un problème <a href="%s/issues/%s">%s#%[2]s</a>` create_issue=`a ouvert un problème <a href="%s/issues/%s">%s#%[2]s</a>`
close_issue=`tickets clos <a href="%s/issues/%s">%s#%[2]s</a>` close_issue=`tickets clos <a href="%s/issues/%s">%s#%[2]s</a>`
reopen_issue=`tickets ré-ouverts <a href="%s/issues/%s">%s#%[2]s</a>` reopen_issue=`tickets ré-ouverts <a href="%s/issues/%s">%s#%[2]s</a>`

1210
conf/locale/locale_gl-ES.ini

File diff suppressed because it is too large Load Diff

60
conf/locale/locale_it-IT.ini

@ -126,7 +126,7 @@ uname_holder=Nome Utente o E-mail
password_holder=Password password_holder=Password
switch_dashboard_context=Cambia Dashboard Context switch_dashboard_context=Cambia Dashboard Context
my_repos=I miei Repository my_repos=I miei Repository
show_more_repos=Show more repositories... show_more_repos=Visualizza altre repositories...
collaborative_repos=Repository Condivisi collaborative_repos=Repository Condivisi
my_orgs=Le mie Organizzazioni my_orgs=Le mie Organizzazioni
my_mirrors=I miei Mirror my_mirrors=I miei Mirror
@ -137,6 +137,7 @@ issues.in_your_repos=Nei tuoi repository
[explore] [explore]
repos=Repository repos=Repository
users=Utenti users=Utenti
organizations=Organizations
search=Cerca search=Cerca
[auth] [auth]
@ -151,18 +152,17 @@ forget_password=Password dimenticata?
sign_up_now=Bisogno di un account? Iscriviti ora. sign_up_now=Bisogno di un account? Iscriviti ora.
confirmation_mail_sent_prompt=Una nuova email di conferma è stata inviata a <b>%s</b>, verifica la tua casella di posta entro le prossime %d ore per completare la registrazione. confirmation_mail_sent_prompt=Una nuova email di conferma è stata inviata a <b>%s</b>, verifica la tua casella di posta entro le prossime %d ore per completare la registrazione.
active_your_account=Attiva il tuo Account active_your_account=Attiva il tuo Account
prohibit_login=Login Prohibited prohibit_login=Accesso Vietato
prohibit_login_desc=Your account is prohibited to login, please contact site admin. prohibit_login_desc=Il tuo account è impossibilitato al login, contatta l'amministratore del sito.
resent_limit_prompt=Siamo spiacenti, si stanno inviando e-mail di attivazione troppo spesso. Si prega di attendere 3 minuti. resent_limit_prompt=Siamo spiacenti, si stanno inviando e-mail di attivazione troppo spesso. Si prega di attendere 3 minuti.
has_unconfirmed_mail=Ciao %s, hai un indirizzo di posta elettronica non confermato (<b>%s</b>). Se non hai ricevuto una e-mail di conferma o vuoi riceverla nuovamente, fare clic sul pulsante qui sotto. has_unconfirmed_mail=Ciao %s, hai un indirizzo di posta elettronica non confermato (<b>%s</b>). Se non hai ricevuto una e-mail di conferma o vuoi riceverla nuovamente, fare clic sul pulsante qui sotto.
resend_mail=Clicca qui per inviare nuovamente l'e-mail di attivazione resend_mail=Clicca qui per inviare nuovamente l'e-mail di attivazione
email_not_associate=Questo indirizzo e-mail non è associato ad alcun account.
send_reset_mail=Clicca qui per (ri)inviare la tua e-mail di reimpostazione password send_reset_mail=Clicca qui per (ri)inviare la tua e-mail di reimpostazione password
reset_password=Reimposta la tua Password reset_password=Reimposta la tua Password
invalid_code=Siamo spiacenti, il codice di conferma è scaduto o non valido. invalid_code=Siamo spiacenti, il codice di conferma è scaduto o non valido.
reset_password_helper=Clicca qui per reimpostare la password reset_password_helper=Clicca qui per reimpostare la password
password_too_short=La lunghezza della password non può essere meno 6 caratteri. password_too_short=La lunghezza della password non può essere meno 6 caratteri.
non_local_account=Non-local accounts cannot change passwords through Gogs. non_local_account=Gli account non locali non possono modificare le password tramite Gogs.
[mail] [mail]
activate_account=Per favore attiva il tuo account activate_account=Per favore attiva il tuo account
@ -189,12 +189,12 @@ TeamName=Nome Team
AuthName=Nome autorizzazione AuthName=Nome autorizzazione
AdminEmail=Email dell'Admin AdminEmail=Email dell'Admin
NewBranchName=New branch name NewBranchName=Nuovo nome del branch
CommitSummary=Commit summary CommitSummary=Riepilogo dei commit
CommitMessage=Commit message CommitMessage=Messaggio di commit
CommitChoice=Commit choice CommitChoice=Scelta di commit
TreeName=File path TreeName=Percorso del file
Content=Content Content=Contenuto
require_error=` non può essere vuoto.` require_error=` non può essere vuoto.`
alpha_dash_error=` ammessi solo caratteri alfanumerici o trattini(-_).` alpha_dash_error=` ammessi solo caratteri alfanumerici o trattini(-_).`
@ -232,7 +232,7 @@ org_still_own_repo=Questa organizzazione ha ancora la proprietà del repository,
target_branch_not_exist=Il ramo (branch) di destinazione non esiste. target_branch_not_exist=Il ramo (branch) di destinazione non esiste.
[user] [user]
change_avatar=Change your avatar change_avatar=Cambia il tuo avatar
join_on=Si è unito il join_on=Si è unito il
repositories=Repository repositories=Repository
activity=Attività pubblica activity=Attività pubblica
@ -269,7 +269,7 @@ change_username_prompt=Questa modifica influenzerà il modo in cui i link si rif
continue=Continua continue=Continua
cancel=Annulla cancel=Annulla
lookup_avatar_by_mail=Lookup Avatar by mail lookup_avatar_by_mail=Ricerca Avatar per mail
federated_avatar_lookup=Federated Avatar Lookup federated_avatar_lookup=Federated Avatar Lookup
enable_custom_avatar=Abilita avatar personalizzato enable_custom_avatar=Abilita avatar personalizzato
choose_new_avatar=Scegli un nuovo avatar choose_new_avatar=Scegli un nuovo avatar
@ -337,6 +337,10 @@ access_token_deletion=Eliminazione Token di accesso personale
access_token_deletion_desc=Eliminare questo token di accesso personale rimuoverà tutti i relativi accessi di applicazione. Si desidera continuare? access_token_deletion_desc=Eliminare questo token di accesso personale rimuoverà tutti i relativi accessi di applicazione. Si desidera continuare?
delete_token_success=Il token di accesso personale è stato eliminato! Non dimenticare di aggiornare anche l'applicazione. delete_token_success=Il token di accesso personale è stato eliminato! Non dimenticare di aggiornare anche l'applicazione.
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=Elimina Account delete_account=Elimina Account
delete_prompt=L'operazione eliminerà permanentemente l'account e <strong>NON POTRÀ</strong> essere annullata! delete_prompt=L'operazione eliminerà permanentemente l'account e <strong>NON POTRÀ</strong> essere annullata!
confirm_delete_account=Conferma Eliminazione confirm_delete_account=Conferma Eliminazione
@ -357,7 +361,7 @@ fork_from=Forka da
fork_visiblity_helper=Non puoi cambiare la visibilità di un repository forkato. fork_visiblity_helper=Non puoi cambiare la visibilità di un repository forkato.
repo_desc=Descrizione repo_desc=Descrizione
repo_lang=Lingua repo_lang=Lingua
repo_gitignore_helper=Select .gitignore templates repo_gitignore_helper=Seleziona i templates di .gitignore
license=Licenza license=Licenza
license_helper=Selezionare un file di licenza license_helper=Selezionare un file di licenza
readme=Readme readme=Readme
@ -365,7 +369,7 @@ readme_helper=Seleziona un template per il readme
auto_init=Inizializzare questo repository con i file e il modello selezionati auto_init=Inizializzare questo repository con i file e il modello selezionati
create_repo=Crea Repository create_repo=Crea Repository
default_branch=Ramo (Branch) predefinito default_branch=Ramo (Branch) predefinito
mirror_prune=Prune mirror_prune=Rimuovi
mirror_prune_desc=Remove any remote-tracking references that no longer exist on the remote mirror_prune_desc=Remove any remote-tracking references that no longer exist on the remote
mirror_interval=Intervallo Mirror (in ore) mirror_interval=Intervallo Mirror (in ore)
mirror_address=Indirizzo del mirror mirror_address=Indirizzo del mirror
@ -384,7 +388,8 @@ migrate_type=Tipo di migrazione
migrate_type_helper=Questo repository sarà un <span class="text blue">mirror</span> migrate_type_helper=Questo repository sarà un <span class="text blue">mirror</span>
migrate_repo=Migra Repository migrate_repo=Migra Repository
migrate.clone_address=Duplica Indirizzo migrate.clone_address=Duplica Indirizzo
migrate.clone_address_desc=Può essere un URL HTTP/HTTPS/GIT o il percorso del server locale. migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=Non è consentito importare repository locali. migrate.permission_denied=Non è consentito importare repository locali.
migrate.invalid_local_path=Percorso locale non valido, non esiste o non è una cartella. migrate.invalid_local_path=Percorso locale non valido, non esiste o non è una cartella.
migrate.failed=Migrazione non riuscita: %v migrate.failed=Migrazione non riuscita: %v
@ -409,7 +414,7 @@ create_new_repo_command=Crea nuovo repository da riga di comando
push_exist_repo=Push un repo esistente dalla riga di comando push_exist_repo=Push un repo esistente dalla riga di comando
repo_is_empty=Questo repository è vuoto, si prega di tornare più tardi! repo_is_empty=Questo repository è vuoto, si prega di tornare più tardi!
code=Codice files=Files
branch=Ramo (Branch) branch=Ramo (Branch)
tree=Albero (Tree) tree=Albero (Tree)
filter_branch_and_tag=Filtra per branch o tag filter_branch_and_tag=Filtra per branch o tag
@ -425,14 +430,15 @@ file_raw=Originale
file_history=Cronologia file_history=Cronologia
file_view_raw=Vedi originale file_view_raw=Vedi originale
file_permalink=Permalink file_permalink=Permalink
file_too_large=This file is too large to be shown file_too_large=Questo file è troppo grande per essere mostrato
video_not_supported_in_browser=Your browser doesn't support HTML5 video tag.
editor.new_file=New file
editor.upload_file=Upload file editor.new_file=Nuovo file
editor.edit_file=Edit file editor.upload_file=Carica File
editor.preview_changes=Preview Changes editor.edit_file=Modifica file
editor.cannot_edit_non_text_files=Cannot edit non-text files editor.preview_changes=Anteprima modifiche
editor.edit_this_file=Edit this file editor.cannot_edit_non_text_files=Non è possibile modificare i file non di testo
editor.edit_this_file=Modifica questo file
editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file
editor.fork_before_edit=You must fork this repository before editing the file editor.fork_before_edit=You must fork this repository before editing the file
editor.delete_this_file=Delete this file editor.delete_this_file=Delete this file
@ -455,6 +461,7 @@ editor.cancel=Cancel
editor.filename_cannot_be_empty=Filename cannot be empty. editor.filename_cannot_be_empty=Filename cannot be empty.
editor.branch_already_exists=Branch '%s' already exists in this repository. editor.branch_already_exists=Branch '%s' already exists in this repository.
editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository.
editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor.
editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository.
editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository.
editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes. editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes.
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=Questa pull request non può essere mergiata automa
pulls.cannot_auto_merge_helper=Effettua il merge manualmente per risolvere i conflitti. pulls.cannot_auto_merge_helper=Effettua il merge manualmente per risolvere i conflitti.
pulls.merge_pull_request=Unisci Pull Request pulls.merge_pull_request=Unisci Pull Request
pulls.open_unmerged_pull_exists=`You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.` pulls.open_unmerged_pull_exists=`You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.`
pulls.delete_branch=Delete Branch
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
milestones.new=Nuova Milestone milestones.new=Nuova Milestone
milestones.open_tab=%d Aperti milestones.open_tab=%d Aperti
@ -1028,6 +1037,7 @@ auths.delete_auth_title=Authentication Deletion
auths.delete_auth_desc=This authentication is going to be deleted, do you want to continue? auths.delete_auth_desc=This authentication is going to be deleted, do you want to continue?
auths.still_in_used=This authentication is still used by some users, please delete or convert these users to another login type first. auths.still_in_used=This authentication is still used by some users, please delete or convert these users to another login type first.
auths.deletion_success=Authentication has been deleted successfully! auths.deletion_success=Authentication has been deleted successfully!
auths.login_source_exist=Login source '%s' already exists.
config.server_config=Configurazione Server config.server_config=Configurazione Server
config.app_name=Nome Applicazione config.app_name=Nome Applicazione

62
conf/locale/locale_ja-JP.ini

@ -137,6 +137,7 @@ issues.in_your_repos=あなたのリポジトリ
[explore] [explore]
repos=リポジトリ repos=リポジトリ
users=ユーザ users=ユーザ
organizations=組織
search=検索 search=検索
[auth] [auth]
@ -156,7 +157,6 @@ prohibit_login_desc=あなたのアカウントはログインを禁止されて
resent_limit_prompt=申し訳ありませんが、アクティベーションメールは頻繁に送信しています。3 分お待ちください。 resent_limit_prompt=申し訳ありませんが、アクティベーションメールは頻繁に送信しています。3 分お待ちください。
has_unconfirmed_mail=こんにちは %s さん、あなたの電子メール アドレス (<b>%s</b>) は未確認です。もし確認メールをまだ確認できていないか、改めて再送信する場合は、下のボタンをクリックしてください。 has_unconfirmed_mail=こんにちは %s さん、あなたの電子メール アドレス (<b>%s</b>) は未確認です。もし確認メールをまだ確認できていないか、改めて再送信する場合は、下のボタンをクリックしてください。
resend_mail=アクティベーションメールを再送信するにはここをクリック resend_mail=アクティベーションメールを再送信するにはここをクリック
email_not_associate=この電子メール アドレスは、アカウントには関連付けられません。
send_reset_mail=パスワードリセットのメールを再送するにはここをクリック send_reset_mail=パスワードリセットのメールを再送するにはここをクリック
reset_password=パスワードリセット reset_password=パスワードリセット
invalid_code=申し訳ありませんが、確認用コードが期限切れまたは無効です。 invalid_code=申し訳ありませんが、確認用コードが期限切れまたは無効です。
@ -189,12 +189,12 @@ TeamName=チーム名
AuthName=承認名 AuthName=承認名
AdminEmail=管理者の電子メール AdminEmail=管理者の電子メール
NewBranchName=New branch name NewBranchName=新しいブランチ名
CommitSummary=Commit summary CommitSummary=Commit summary
CommitMessage=Commit message CommitMessage=Commit message
CommitChoice=Commit choice CommitChoice=Commit choice
TreeName=File path TreeName=File path
Content=Content Content=コンテンツ
require_error=空にできません require_error=空にできません
alpha_dash_error=アルファベット、数字、ハイフン"-"、アンダースコア"_"のいずれかの必要があります alpha_dash_error=アルファベット、数字、ハイフン"-"、アンダースコア"_"のいずれかの必要があります
@ -248,7 +248,7 @@ form.name_pattern_not_allowed=ユーザ名のパターン '%s' は許可され
[settings] [settings]
profile=プロフィール profile=プロフィール
password=パスワード password=パスワード
avatar=Avatar avatar=アバター
ssh_keys=SSH キー ssh_keys=SSH キー
social=SNSアカウント social=SNSアカウント
applications=アプリケーション applications=アプリケーション
@ -269,7 +269,7 @@ change_username_prompt=この変更はリンクをアカウントに関連付け
continue=続行 continue=続行
cancel=キャンセル cancel=キャンセル
lookup_avatar_by_mail=Lookup Avatar by mail lookup_avatar_by_mail=メールからアバターを取得
federated_avatar_lookup=Federated Avatar Lookup federated_avatar_lookup=Federated Avatar Lookup
enable_custom_avatar=カスタムのアバターを有効にする enable_custom_avatar=カスタムのアバターを有効にする
choose_new_avatar=新しいアバターを選択 choose_new_avatar=新しいアバターを選択
@ -337,6 +337,10 @@ access_token_deletion=パーソナルアクセストークンの削除
access_token_deletion_desc=パーソナルアクセストークンを削除すると、関連するアプリケーションのすべてのアクセスが削除されます。続行しますか? access_token_deletion_desc=パーソナルアクセストークンを削除すると、関連するアプリケーションのすべてのアクセスが削除されます。続行しますか?
delete_token_success=パーソナルアクセストークンは正常に削除されました!同時にあなたのアプリケーションを更新することを忘れないでください。 delete_token_success=パーソナルアクセストークンは正常に削除されました!同時にあなたのアプリケーションを更新することを忘れないでください。
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=アカウントを削除 delete_account=アカウントを削除
delete_prompt=この操作をするとアカウントが完全に削除され、<strong>二度と元に戻すことができなくなります</strong> ! delete_prompt=この操作をするとアカウントが完全に削除され、<strong>二度と元に戻すことができなくなります</strong> !
confirm_delete_account=削除の確認 confirm_delete_account=削除の確認
@ -370,7 +374,7 @@ mirror_prune_desc=Remove any remote-tracking references that no longer exist on
mirror_interval=ミラー 間隔(時) mirror_interval=ミラー 間隔(時)
mirror_address=ミラー アドレス mirror_address=ミラー アドレス
mirror_address_desc=Please include necessary user credentials in the address. mirror_address_desc=Please include necessary user credentials in the address.
mirror_last_synced=Last Synced mirror_last_synced=最終同期
watchers=ウォッチャー watchers=ウォッチャー
stargazers=Stargazers stargazers=Stargazers
forks=フォーク forks=フォーク
@ -384,7 +388,8 @@ migrate_type=マイグレーションの種類
migrate_type_helper=このリポジトリは、<span class="text blue"> ミラー</span> になります migrate_type_helper=このリポジトリは、<span class="text blue"> ミラー</span> になります
migrate_repo=リポジトリを移行 migrate_repo=リポジトリを移行
migrate.clone_address=クローンアドレス migrate.clone_address=クローンアドレス
migrate.clone_address_desc=これは、HTTP/HTTPS/GIT URL またはローカル サーバー パスを設定できます。 migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=ローカル リポジトリをインポートすることはできません。 migrate.permission_denied=ローカル リポジトリをインポートすることはできません。
migrate.invalid_local_path=ローカルパスが無効です。存在しないかディレクトリではありません。 migrate.invalid_local_path=ローカルパスが無効です。存在しないかディレクトリではありません。
migrate.failed=移行に失敗しました: %v migrate.failed=移行に失敗しました: %v
@ -409,7 +414,7 @@ create_new_repo_command=コマンドラインで新しいリポジトリを作
push_exist_repo=コマンド ・ ラインから既存のリポジトリをプッシュ push_exist_repo=コマンド ・ ラインから既存のリポジトリをプッシュ
repo_is_empty=このリポジトリは空です、後で戻って来て下さい! repo_is_empty=このリポジトリは空です、後で戻って来て下さい!
code=コード files=Files
branch=ブランチ branch=ブランチ
tree=ツリー tree=ツリー
filter_branch_and_tag=ブランチまたはタグをフィルタリング filter_branch_and_tag=ブランチまたはタグをフィルタリング
@ -426,35 +431,37 @@ file_history=履歴
file_view_raw=Rawデータを見る file_view_raw=Rawデータを見る
file_permalink=パーマリンク file_permalink=パーマリンク
file_too_large=このファイルは大きすぎるため、表示できません。 file_too_large=このファイルは大きすぎるため、表示できません。
video_not_supported_in_browser=Your browser doesn't support HTML5 video tag.
editor.new_file=New file editor.new_file=New file
editor.upload_file=Upload file editor.upload_file=Upload file
editor.edit_file=Edit file editor.edit_file=ファイルを編集
editor.preview_changes=Preview Changes editor.preview_changes=Preview Changes
editor.cannot_edit_non_text_files=Cannot edit non-text files editor.cannot_edit_non_text_files=Cannot edit non-text files
editor.edit_this_file=Edit this file editor.edit_this_file=このファイルを編集
editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file
editor.fork_before_edit=You must fork this repository before editing the file editor.fork_before_edit=You must fork this repository before editing the file
editor.delete_this_file=Delete this file editor.delete_this_file=このファイルを削除
editor.must_have_write_access=You must have write access to make or propose changes to this file editor.must_have_write_access=You must have write access to make or propose changes to this file
editor.file_delete_success=File '%s' has been deleted successfully! editor.file_delete_success=File '%s' has been deleted successfully!
editor.name_your_file=Name your file... editor.name_your_file=Name your file...
editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace.
editor.or=or editor.or=or
editor.cancel_lower=cancel editor.cancel_lower=キャンセル
editor.commit_changes=Commit Changes editor.commit_changes=変更をコミット
editor.add_tmpl=Add '%s/<filename>' editor.add_tmpl=Add '%s/<filename>'
editor.add=Add '%s' editor.add='%s' を追加
editor.update=Update '%s' editor.update='%s' を更新
editor.delete=Delete '%s' editor.delete='%s' を削除
editor.commit_message_desc=Add an optional extended description... editor.commit_message_desc=Add an optional extended description...
editor.commit_directly_to_this_branch=Commit directly to the <strong class="branch-name">%s</strong> branch. editor.commit_directly_to_this_branch=Commit directly to the <strong class="branch-name">%s</strong> branch.
editor.create_new_branch=Create a <strong>new branch</strong> for this commit and start a pull request. editor.create_new_branch=Create a <strong>new branch</strong> for this commit and start a pull request.
editor.new_branch_name_desc=New branch name... editor.new_branch_name_desc=New branch name...
editor.cancel=Cancel editor.cancel=キャンセル
editor.filename_cannot_be_empty=Filename cannot be empty. editor.filename_cannot_be_empty=Filename cannot be empty.
editor.branch_already_exists=Branch '%s' already exists in this repository. editor.branch_already_exists=Branch '%s' already exists in this repository.
editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository.
editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor.
editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository.
editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository.
editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes. editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes.
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=This pull request can't be merged automatically bec
pulls.cannot_auto_merge_helper=競合を解決するためには、手動でマージする必要があります。 pulls.cannot_auto_merge_helper=競合を解決するためには、手動でマージする必要があります。
pulls.merge_pull_request=プルリクエストをマージします。 pulls.merge_pull_request=プルリクエストをマージします。
pulls.open_unmerged_pull_exists=`You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.` pulls.open_unmerged_pull_exists=`You can't perform reopen operation because there is already an open pull request (#%d) from same repository with same merge information and is waiting for merging.`
pulls.delete_branch=Delete Branch
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
milestones.new=新しいマイルストーン milestones.new=新しいマイルストーン
milestones.open_tab=%d オープン milestones.open_tab=%d オープン
@ -616,7 +625,7 @@ wiki.save_page=ページを保存
wiki.last_commit_info=%s このページを編集 %s wiki.last_commit_info=%s このページを編集 %s
wiki.edit_page_button=編集 wiki.edit_page_button=編集
wiki.new_page_button=新規ページ wiki.new_page_button=新規ページ
wiki.delete_page_button=Delete Page wiki.delete_page_button=ページの削除
wiki.delete_page_notice_1=This will delete the page <code>"%s"</code>. Please be certain. wiki.delete_page_notice_1=This will delete the page <code>"%s"</code>. Please be certain.
wiki.page_already_exists=既に同じ名前のWiki ページが存在します。 wiki.page_already_exists=既に同じ名前のWiki ページが存在します。
wiki.pages=ページ wiki.pages=ページ
@ -625,15 +634,15 @@ wiki.last_updated=最終更新 %s
settings=設定 settings=設定
settings.options=オプション settings.options=オプション
settings.collaboration=コラボレーション settings.collaboration=コラボレーション
settings.collaboration.admin=Admin settings.collaboration.admin=管理
settings.collaboration.write=Write settings.collaboration.write=書込
settings.collaboration.read=Read settings.collaboration.read=読込
settings.collaboration.undefined=Undefined settings.collaboration.undefined=Undefined
settings.hooks=Webhooks settings.hooks=Webhooks
settings.githooks=Git のフック settings.githooks=Git のフック
settings.basic_settings=基本設定 settings.basic_settings=基本設定
settings.mirror_settings=Mirror Settings settings.mirror_settings=Mirror Settings
settings.sync_mirror=Sync Now settings.sync_mirror=今すぐ同期
settings.mirror_sync_in_progress=Mirror syncing is in progress, please refresh page in about a minute. settings.mirror_sync_in_progress=Mirror syncing is in progress, please refresh page in about a minute.
settings.site=公式サイト settings.site=公式サイト
settings.update_settings=設定の更新 settings.update_settings=設定の更新
@ -649,7 +658,7 @@ settings.use_internal_issue_tracker=Use builtin lightweight issue tracker
settings.use_external_issue_tracker=外部課題トラッキングシステムを使用 settings.use_external_issue_tracker=外部課題トラッキングシステムを使用
settings.tracker_url_format=外部課題トラッキングツール URLのフォーマット settings.tracker_url_format=外部課題トラッキングツール URLのフォーマット
settings.tracker_issue_style=External Issue Tracker Naming Style: settings.tracker_issue_style=External Issue Tracker Naming Style:
settings.tracker_issue_style.numeric=Numeric settings.tracker_issue_style.numeric=数値
settings.tracker_issue_style.alphanumeric=Alphanumeric settings.tracker_issue_style.alphanumeric=Alphanumeric
settings.tracker_url_format_desc=You can use placeholder <code>{user} {repo} {index}</code> for user name, repository name and issue index. settings.tracker_url_format_desc=You can use placeholder <code>{user} {repo} {index}</code> for user name, repository name and issue index.
settings.pulls_desc=Enable pull requests to accept public contributions settings.pulls_desc=Enable pull requests to accept public contributions
@ -665,10 +674,10 @@ settings.transfer_desc=リポジトリをあなたが管理者権限を持って
settings.transfer_notices_1=-新しい所有者が個人ユーザーの場合、あなたがアクセスできなくなります。 settings.transfer_notices_1=-新しい所有者が個人ユーザーの場合、あなたがアクセスできなくなります。
settings.transfer_notices_2=- You will conserve access if new owner is an organization and if you're one of the owners. settings.transfer_notices_2=- You will conserve access if new owner is an organization and if you're one of the owners.
settings.transfer_form_title=操作を確認するために、以下の情報を入力してください。 settings.transfer_form_title=操作を確認するために、以下の情報を入力してください。
settings.wiki_delete=Erase Wiki Data settings.wiki_delete=Wikiのデータ消去
settings.wiki_delete_desc=Once you erase wiki data there is no going back. Please be certain. settings.wiki_delete_desc=Wikiのデータを消去すると元に戻すことは出来ません。よく確認してください。
settings.wiki_delete_notices_1=- This will delete and disable the wiki for %s settings.wiki_delete_notices_1=- This will delete and disable the wiki for %s
settings.wiki_deletion_success=Repository wiki data have been erased successfully. settings.wiki_deletion_success=Wikiのデータ消去が完了しました。
settings.delete=このリポジトリを削除 settings.delete=このリポジトリを削除
settings.delete_desc=リポジトリを削除すると元に戻せません。確実に確認してください。 settings.delete_desc=リポジトリを削除すると元に戻せません。確実に確認してください。
settings.delete_notices_1=-この操作は<strong>元に戻せません</strong> 。 settings.delete_notices_1=-この操作は<strong>元に戻せません</strong> 。
@ -1028,6 +1037,7 @@ auths.delete_auth_title=認証削除
auths.delete_auth_desc=認証を削除します、継続しますか? auths.delete_auth_desc=認証を削除します、継続しますか?
auths.still_in_used=This authentication is still used by some users, please delete or convert these users to another login type first. auths.still_in_used=This authentication is still used by some users, please delete or convert these users to another login type first.
auths.deletion_success=認証が正常に削除されました。 auths.deletion_success=認証が正常に削除されました。
auths.login_source_exist=Login source '%s' already exists.
config.server_config=サーバーの構成 config.server_config=サーバーの構成
config.app_name=アプリケーション名 config.app_name=アプリケーション名

1211
conf/locale/locale_ko-KR.ini

File diff suppressed because it is too large Load Diff

164
conf/locale/locale_lv-LV.ini

@ -6,7 +6,7 @@ explore=Izpētīt
help=Palīdzība help=Palīdzība
sign_in=Pierakstīties sign_in=Pierakstīties
sign_out=Izrakstīties sign_out=Izrakstīties
sign_up=Pieteikties sign_up=Reģistrēties
register=Reģistrēties register=Reģistrēties
website=Mājas lapa website=Mājas lapa
version=Versija version=Versija
@ -96,8 +96,8 @@ offline_mode=Iespējot bezsaistes režīmu
offline_mode_popup=Atspējot CDN arī produkcijas režīmā, visi resursu faili tiks piegādāti no servera. offline_mode_popup=Atspējot CDN arī produkcijas režīmā, visi resursu faili tiks piegādāti no servera.
disable_gravatar=Atspējot Gravatar pakalpojumu disable_gravatar=Atspējot Gravatar pakalpojumu
disable_gravatar_popup=Atspējot Gravatar un citus avotus, visus avatarus augšupielādēts lietotāji vai izmantos noklusēto attēlu. disable_gravatar_popup=Atspējot Gravatar un citus avotus, visus avatarus augšupielādēts lietotāji vai izmantos noklusēto attēlu.
federated_avatar_lookup=Enable Federated Avatars Lookup federated_avatar_lookup=Iespējot apvienoto profila bilžu meklētāju
federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. federated_avatar_lookup_popup=Iespējot apvienoto profila bilžu meklētāju, lai izmantotu atvērtā koda apvienoto servisu balstītu uz libravatar.
disable_registration=Atspējot lietotāju reģistrāciju disable_registration=Atspējot lietotāju reģistrāciju
disable_registration_popup=Atspējot lietotāju reģistrāciju, tikai administrators varēs izveidot jaunus lietotāju kontus. disable_registration_popup=Atspējot lietotāju reģistrāciju, tikai administrators varēs izveidot jaunus lietotāju kontus.
enable_captcha=Iespējot drošības kodu enable_captcha=Iespējot drošības kodu
@ -137,6 +137,7 @@ issues.in_your_repos=Jūsu repozitorijos
[explore] [explore]
repos=Repozitoriji repos=Repozitoriji
users=Lietotāji users=Lietotāji
organizations=Organizations
search=Meklēt search=Meklēt
[auth] [auth]
@ -156,7 +157,6 @@ prohibit_login_desc=Ar Jūsu kontu nav atļauts pieteikties, sazinoties ar lapas
resent_limit_prompt=Atvainojiet, Jūs sūtījāt aktivizācijas e-pastu pārāk bieži. Lūdzu, gaidiet 3 minūtes. resent_limit_prompt=Atvainojiet, Jūs sūtījāt aktivizācijas e-pastu pārāk bieži. Lūdzu, gaidiet 3 minūtes.
has_unconfirmed_mail=Sveiki %s, Jums ir neapstiprināta e-pasta adrese (<b>%s</b>). Ja neesat saņēmis apstiprināšanas e-pastu vai Jums ir nepieciešams nosūtīt jaunu, lūdzu, nospiediet pogu, kas atrodas zemāk. has_unconfirmed_mail=Sveiki %s, Jums ir neapstiprināta e-pasta adrese (<b>%s</b>). Ja neesat saņēmis apstiprināšanas e-pastu vai Jums ir nepieciešams nosūtīt jaunu, lūdzu, nospiediet pogu, kas atrodas zemāk.
resend_mail=Nospiediet šeit, lai vēlreiz nosūtītu aktivizācijas e-pastu resend_mail=Nospiediet šeit, lai vēlreiz nosūtītu aktivizācijas e-pastu
email_not_associate=Šī e-pasta adrese nav saistīta ar Jūsu kontu.
send_reset_mail=Spiediet šeit, lai nosūtītu paroles maiņas vēstuli uz Jūsu e-pastu send_reset_mail=Spiediet šeit, lai nosūtītu paroles maiņas vēstuli uz Jūsu e-pastu
reset_password=Atjaunot savu paroli reset_password=Atjaunot savu paroli
invalid_code=Atvainojiet, Jūsu apstiprināšanas kodam ir beidzies derīguma termiņš vai arī tas ir nepareizs. invalid_code=Atvainojiet, Jūsu apstiprināšanas kodam ir beidzies derīguma termiņš vai arī tas ir nepareizs.
@ -189,12 +189,12 @@ TeamName=Komandas nosaukums
AuthName=Autorizācijas nosaukums AuthName=Autorizācijas nosaukums
AdminEmail=Admin e-pasta adrese AdminEmail=Admin e-pasta adrese
NewBranchName=New branch name NewBranchName=Jauna atzara nosaukums
CommitSummary=Commit summary CommitSummary=Revīzijas kopsavilkums
CommitMessage=Commit message CommitMessage=Revīzijas ziņojums
CommitChoice=Commit choice CommitChoice=Revīzijas izvēle
TreeName=File path TreeName=Faila ceļš
Content=Content Content=Saturs
require_error=` nedrīkst būt tukšs.` require_error=` nedrīkst būt tukšs.`
alpha_dash_error=` drīkst saturēt tikai latīņu alfabēta burtus, ciparus vai domuzīmes (-_).` alpha_dash_error=` drīkst saturēt tikai latīņu alfabēta burtus, ciparus vai domuzīmes (-_).`
@ -269,8 +269,8 @@ change_username_prompt=Šī izmaiņa ietekmēs saites, kas norāda uz Jūsu kont
continue=Turpināt continue=Turpināt
cancel=Atcelt cancel=Atcelt
lookup_avatar_by_mail=Lookup Avatar by mail lookup_avatar_by_mail=Meklēt profila bildes pēc e-pasta
federated_avatar_lookup=Federated Avatar Lookup federated_avatar_lookup=Apvienotais profila bilžu meklētājs
enable_custom_avatar=Iespējot maināmu profila attēlu enable_custom_avatar=Iespējot maināmu profila attēlu
choose_new_avatar=Izvēlēties jaunu profila attēlu choose_new_avatar=Izvēlēties jaunu profila attēlu
update_avatar=Saglabāt profila bildi update_avatar=Saglabāt profila bildi
@ -337,6 +337,10 @@ access_token_deletion=Personīgā piekļuves talona dzēšana
access_token_deletion_desc=Dzēšot personīgo piekļuves talonu, tiks liegta piekļuve aplikācijām, kas to izmanto. Vai vēlaties turpināt? access_token_deletion_desc=Dzēšot personīgo piekļuves talonu, tiks liegta piekļuve aplikācijām, kas to izmanto. Vai vēlaties turpināt?
delete_token_success=Personīgās piekļuves talons veiksmīgi izdzēsts! Neaizmirstiet nomainīt uz citu aplikācijās, kas to izmantoja. delete_token_success=Personīgās piekļuves talons veiksmīgi izdzēsts! Neaizmirstiet nomainīt uz citu aplikācijās, kas to izmantoja.
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=Dzēst savu kontu delete_account=Dzēst savu kontu
delete_prompt=Šī darbība pilnībā izdzēsīs Jūsu kontu, kā arī tā ir <strong>NEATGRIEZENISKA</strong>! delete_prompt=Šī darbība pilnībā izdzēsīs Jūsu kontu, kā arī tā ir <strong>NEATGRIEZENISKA</strong>!
confirm_delete_account=Apstiprināt dzēšanu confirm_delete_account=Apstiprināt dzēšanu
@ -357,7 +361,7 @@ fork_from=Atdalīt no
fork_visiblity_helper=Atdalītam repozitorijam nav iespējams nomainīt tā redzamību fork_visiblity_helper=Atdalītam repozitorijam nav iespējams nomainīt tā redzamību
repo_desc=Apraksts repo_desc=Apraksts
repo_lang=Valoda repo_lang=Valoda
repo_gitignore_helper=Select .gitignore templates repo_gitignore_helper=Izvēlieties .gitignore sagatavi
license=Licence license=Licence
license_helper=Izvēlieties licences failu license_helper=Izvēlieties licences failu
readme=LasiMani readme=LasiMani
@ -370,7 +374,7 @@ mirror_prune_desc=Izdzēst visas ārējās atsauces, kas ārējā repozitorijā
mirror_interval=Spoguļošanas intervāls (stundās) mirror_interval=Spoguļošanas intervāls (stundās)
mirror_address=Spoguļa adrese mirror_address=Spoguļa adrese
mirror_address_desc=Lūdzu iekļaujiet adresē nepieciešamo lietotājvārdu/paroli. mirror_address_desc=Lūdzu iekļaujiet adresē nepieciešamo lietotājvārdu/paroli.
mirror_last_synced=Last Synced mirror_last_synced=Pēdējo reizi sinhronizēts
watchers=Novērotāji watchers=Novērotāji
stargazers=Zvaigžņdevēji stargazers=Zvaigžņdevēji
forks=Atdalītie repozitoriji forks=Atdalītie repozitoriji
@ -384,7 +388,8 @@ migrate_type=Migrācijas veids
migrate_type_helper=Šis repozitorijs būs <span class="text blue">spogulis</span> migrate_type_helper=Šis repozitorijs būs <span class="text blue">spogulis</span>
migrate_repo=Migrēt repozitoriju migrate_repo=Migrēt repozitoriju
migrate.clone_address=Klonēšanas adrese migrate.clone_address=Klonēšanas adrese
migrate.clone_address_desc=Tas var būt HTTP/HTTPS/GIT URL vai ceļš uz lokālā servera. migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=Jums nav tiesību importēt lokālu repozitoriju. migrate.permission_denied=Jums nav tiesību importēt lokālu repozitoriju.
migrate.invalid_local_path=Nekorents lokālais ceļš, tas neeksistē vai nav direktorijs. migrate.invalid_local_path=Nekorents lokālais ceļš, tas neeksistē vai nav direktorijs.
migrate.failed=Migrācija neizdevās: %v migrate.failed=Migrācija neizdevās: %v
@ -409,7 +414,7 @@ create_new_repo_command=Izveidot jaunu repozitoriju komandrindā
push_exist_repo=Nosūtīt izmaiņas no komandrindas eksistējošam repozitorijam push_exist_repo=Nosūtīt izmaiņas no komandrindas eksistējošam repozitorijam
repo_is_empty=Šis repozitorijs ir tukšs, apskatiet atkal vēlāk! repo_is_empty=Šis repozitorijs ir tukšs, apskatiet atkal vēlāk!
code=Kods files=Files
branch=Atzars branch=Atzars
tree=Koks tree=Koks
filter_branch_and_tag=Filtrēt atzarus vai tagus filter_branch_and_tag=Filtrēt atzarus vai tagus
@ -426,44 +431,46 @@ file_history=Vēsture
file_view_raw=Rādīt neapstrādātu file_view_raw=Rādīt neapstrādātu
file_permalink=Patstāvīgā saite file_permalink=Patstāvīgā saite
file_too_large=Šis fails ir par lielu, lai to parādītu file_too_large=Šis fails ir par lielu, lai to parādītu
video_not_supported_in_browser=Your browser doesn't support HTML5 video tag.
editor.new_file=New file
editor.upload_file=Upload file editor.new_file=Jauns fails
editor.edit_file=Edit file editor.upload_file=Augšupielādēt failu
editor.preview_changes=Preview Changes editor.edit_file=Labot failu
editor.cannot_edit_non_text_files=Cannot edit non-text files editor.preview_changes=Priekšskatīt izmaiņas
editor.edit_this_file=Edit this file editor.cannot_edit_non_text_files=Nevar rediģēt failus, kas nav teksta faili
editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file editor.edit_this_file=Rediģēt šo failu
editor.fork_before_edit=You must fork this repository before editing the file editor.must_be_on_a_branch=Ir jābūt izvēlētam atzaram, lai varētu veikt vai piedāvāt izmaiņas šim failam
editor.delete_this_file=Delete this file editor.fork_before_edit=Lai varētu labot failu ir nepieciešams atdalīt repozitoriju
editor.must_have_write_access=You must have write access to make or propose changes to this file editor.delete_this_file=Dzēst šo failu
editor.file_delete_success=File '%s' has been deleted successfully! editor.must_have_write_access=Jums ir jābūt rakstīšanas tiesībām, lai varētu veikt vai piedāvāt izmaiņas šim failam
editor.name_your_file=Name your file... editor.file_delete_success=Fails '%s' ir veiksmīgi izdzēsts!
editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. editor.name_your_file=Ievadiet faila nosaukumu...
editor.or=or editor.filename_help=Lai pievienotu direktoriju, ierakstiet tās nosaukumu un nospiediet /. Lai noņemtu direktoriju, ielieciet kursoru pirms faila nosaukuma un nospiediet atpakaļatkāpes taustiņu.
editor.cancel_lower=cancel editor.or=vai
editor.commit_changes=Commit Changes editor.cancel_lower=atcelt
editor.add_tmpl=Add '%s/<filename>' editor.commit_changes=Pabeigt revīziju
editor.add=Add '%s' editor.add_tmpl=Pievienot '%s/<filename>'
editor.update=Update '%s' editor.add=Pievienot '%s'
editor.delete=Delete '%s' editor.update=Atjaunināt '%s'
editor.commit_message_desc=Add an optional extended description... editor.delete=Dzēst '%s'
editor.commit_directly_to_this_branch=Commit directly to the <strong class="branch-name">%s</strong> branch. editor.commit_message_desc=Pievienot neobligātu paplašinātu aprakstu...
editor.create_new_branch=Create a <strong>new branch</strong> for this commit and start a pull request. editor.commit_directly_to_this_branch=Apstiprināt revīzijas izmaiņas atzarā <strong class="branch-name">%s</strong>.
editor.new_branch_name_desc=New branch name... editor.create_new_branch=Izveidot <strong>jaunu atzaru</strong> un izmaiņu pieprasījumu šai revīzijai.
editor.cancel=Cancel editor.new_branch_name_desc=Jaunā atzara nosaukums...
editor.filename_cannot_be_empty=Filename cannot be empty. editor.cancel=Atcelt
editor.branch_already_exists=Branch '%s' already exists in this repository. editor.filename_cannot_be_empty=Nav ievadīts faila nosaukums.
editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. editor.branch_already_exists=Atzars '%s' šajā repozitorijā jau eksistē.
editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. editor.directory_is_a_file=Ieraksts '%s' vecāka ceļā ir fails nevis direktorija šajā repozitorijā.
editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor.
editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes. editor.filename_is_a_directory=Faila nosaukums '%s' sakrīt ar direktorijas nosaukumu šajā repozitorijā.
editor.file_already_exists=A file with name '%s' already exists in this repository. editor.file_editing_no_longer_exists=Fails '%s', ko labojat, vairs neeksistē repozitorijā.
editor.no_changes_to_show=There are no changes to show. editor.file_changed_while_editing=Faila saturs ir mainījies kopš brīža, kad sākāt to labot. <a target="_blank" href="%s">Nospiediet šeit</a>, lai redzētu kas ir mainījies vai <strong>nospiediet atkārtoti pabeigt revīziju</strong>, lai pārrakstītu izmaiņas.
editor.fail_to_update_file=Failed to update/create file '%s' with error: %v editor.file_already_exists=Fails ar nosaukumu '%s' repozitorijā jau eksistē.
editor.add_subdir=Add subdirectory... editor.no_changes_to_show=Nav izmaiņu, ko rādīt.
editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v editor.fail_to_update_file=Neizdevās izmainīt/izveidot failu '%s', kļūda: %v
editor.upload_files_to_dir=Upload files to '%s' editor.add_subdir=Pievienot apakšdirektoriju...
editor.unable_to_upload_files=Neizdevās augšupielādēt failus uz direktoriju '%s', kļūda: %v
editor.upload_files_to_dir=Augšupielādēt failus uz direktoriju '%s'
commits.commits=Revīzijas commits.commits=Revīzijas
commits.search=Meklēt revīzijas commits.search=Meklēt revīzijas
@ -490,11 +497,11 @@ issues.create=Pieteikt problēmu
issues.new_label=Jauna etiķete issues.new_label=Jauna etiķete
issues.new_label_placeholder=Etiķetes nosaukums... issues.new_label_placeholder=Etiķetes nosaukums...
issues.create_label=Izveidot etiķeti issues.create_label=Izveidot etiķeti
issues.label_templates.title=Load a predefined set of labels issues.label_templates.title=Ielādēt sākotnēji noteikto etiķešu kopu
issues.label_templates.info=There aren’t any labels yet. You can click on the "New Label" button above to create one or use a predefined set below. issues.label_templates.info=Nav definēta neviena etiķete. Nospiediet pogu "Izveidot etiķeti", lai to izveidotu vai izmantojiet zemāk piedāvātās etiķetes.
issues.label_templates.helper=Select a label set issues.label_templates.helper=Izvēlieties etiķešu kopu
issues.label_templates.use=Use this label set issues.label_templates.use=Izmantot šo etiķešu kopu
issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v issues.label_templates.fail_to_load_file=Neizdevās ielādēt etiķetes sagataves failu '%s': %v
issues.open_tab=%d atvērti issues.open_tab=%d atvērti
issues.close_tab=%d aizvērti issues.close_tab=%d aizvērti
issues.filter_label=Etiķete issues.filter_label=Etiķete
@ -536,7 +543,7 @@ issues.commit_ref_at=`pieminēja šo problēmu revīzijā <a id="%[1]s" href="#%
issues.poster=Autors issues.poster=Autors
issues.collaborator=Līdzstrādnieks issues.collaborator=Līdzstrādnieks
issues.owner=Īpašnieks issues.owner=Īpašnieks
issues.sign_in_require_desc=<a href="%s">Sign in</a> to join this conversation. issues.sign_in_require_desc=<a href="%s">Pierakstieties</a>, lai pievienotos šai sarunai.
issues.edit=Labot issues.edit=Labot
issues.cancel=Atcelt issues.cancel=Atcelt
issues.save=Saglabāt issues.save=Saglabāt
@ -551,8 +558,8 @@ issues.label_deletion=Etiķetes dzēšana
issues.label_deletion_desc=Dzēšot šo etiķeti, tā tiks noņemta no visām saistītajām problēmām. Vai vēlaties turpināt? issues.label_deletion_desc=Dzēšot šo etiķeti, tā tiks noņemta no visām saistītajām problēmām. Vai vēlaties turpināt?
issues.label_deletion_success=Etiķete tika veiksmīgi izdzēsta! issues.label_deletion_success=Etiķete tika veiksmīgi izdzēsta!
issues.num_participants=%d dalībnieki issues.num_participants=%d dalībnieki
issues.attachment.open_tab=`Click to see "%s" in a new tab` issues.attachment.open_tab=`Noklikšķiniet, lai apskatītos "%s" jaunā logā`
issues.attachment.download=`Click to download "%s"` issues.attachment.download=`Noklikšķiniet, lai lejupielādētu "%s"`
pulls.new=Jauns izmaiņu pieprasījums pulls.new=Jauns izmaiņu pieprasījums
pulls.compare_changes=Salīdzināt izmaiņas pulls.compare_changes=Salīdzināt izmaiņas
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=Šis izmaiņu pieprasījums nevar tikt automātiski
pulls.cannot_auto_merge_helper=Lūdzu sapludiniet manuāli, lai atrisinātu konfliktus. pulls.cannot_auto_merge_helper=Lūdzu sapludiniet manuāli, lai atrisinātu konfliktus.
pulls.merge_pull_request=Izmaiņu pieprasījuma sapludināšana pulls.merge_pull_request=Izmaiņu pieprasījuma sapludināšana
pulls.open_unmerged_pull_exists=`Jūs nevarat veikt atkārtotas atvēršanas darbību, jo jau eksistē izmaiņu pieprasījums (#%d) no šī repozitorija ar tādu pašu sapludināšanas informāciju un gaida sapludināšanu.` pulls.open_unmerged_pull_exists=`Jūs nevarat veikt atkārtotas atvēršanas darbību, jo jau eksistē izmaiņu pieprasījums (#%d) no šī repozitorija ar tādu pašu sapludināšanas informāciju un gaida sapludināšanu.`
pulls.delete_branch=Delete Branch
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
milestones.new=Jauns atskaites punkts milestones.new=Jauns atskaites punkts
milestones.open_tab=%d atvērti milestones.open_tab=%d atvērti
@ -632,9 +641,9 @@ settings.collaboration.undefined=Nedefinētas
settings.hooks=Tīmekļa āķi settings.hooks=Tīmekļa āķi
settings.githooks=Git āķi settings.githooks=Git āķi
settings.basic_settings=Pamatiestatījumi settings.basic_settings=Pamatiestatījumi
settings.mirror_settings=Mirror Settings settings.mirror_settings=Spoguļa iestatījumi
settings.sync_mirror=Sync Now settings.sync_mirror=Sinhronizēt tagad
settings.mirror_sync_in_progress=Mirror syncing is in progress, please refresh page in about a minute. settings.mirror_sync_in_progress=Notiek spoguļa sinhronizācija, uzgaidiet aptuveni minūti un atjaunojiet lapu.
settings.site=Oficiālā mājas lapa settings.site=Oficiālā mājas lapa
settings.update_settings=Mainīt iestatījumus settings.update_settings=Mainīt iestatījumus
settings.change_reponame_prompt=Šī izmaiņa ietekmēs saites, kas ir saistītas ar šo repozitoriju. settings.change_reponame_prompt=Šī izmaiņa ietekmēs saites, kas ir saistītas ar šo repozitoriju.
@ -644,8 +653,8 @@ settings.use_internal_wiki=Izmantot iebūvēto vikivietni
settings.use_external_wiki=Izmantot ārējo vikivietni settings.use_external_wiki=Izmantot ārējo vikivietni
settings.external_wiki_url=Ārējās Vikivietnes adrese settings.external_wiki_url=Ārējās Vikivietnes adrese
settings.external_wiki_url_desc=Apmeklētāji tiks novirzīti uz adresi, kad viņi uzklikšķinās uz cilnes. settings.external_wiki_url_desc=Apmeklētāji tiks novirzīti uz adresi, kad viņi uzklikšķinās uz cilnes.
settings.issues_desc=Enable issue tracker settings.issues_desc=Iespējot problēmu sekotāju
settings.use_internal_issue_tracker=Use builtin lightweight issue tracker settings.use_internal_issue_tracker=Izmantot iebūvētu vieglu problēmu sekotāju
settings.use_external_issue_tracker=Izmantot ārējo problēmu sekotāju settings.use_external_issue_tracker=Izmantot ārējo problēmu sekotāju
settings.tracker_url_format=Ārējā problēmu sekotāja adreses formāts settings.tracker_url_format=Ārējā problēmu sekotāja adreses formāts
settings.tracker_issue_style=Ārējā problēmu reģistra nosaukumu stils: settings.tracker_issue_style=Ārējā problēmu reģistra nosaukumu stils:
@ -720,8 +729,8 @@ settings.event_send_everything=Vēlos saņemt <strong>visu</strong>.
settings.event_choose=Atzīmēt, ko vēlos saņemt. settings.event_choose=Atzīmēt, ko vēlos saņemt.
settings.event_create=Izveidot settings.event_create=Izveidot
settings.event_create_desc=Atzara vai taga izveidošana settings.event_create_desc=Atzara vai taga izveidošana
settings.event_pull_request=Pull Request settings.event_pull_request=Izmaiņu pieprasījums
settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. settings.event_pull_request_desc=Atvērts, aizvērts, atkāroti atvērts, labots, piešķirts vai noņemts izmaiņu pieprasījums, vai mainīta etiķete, vai veikta sinhronizācija.
settings.event_push=Izmaiņu nosūtīšana settings.event_push=Izmaiņu nosūtīšana
settings.event_push_desc=Git izmaiņu nosūtīšana uz repozitoriju settings.event_push_desc=Git izmaiņu nosūtīšana uz repozitoriju
settings.active=Aktīvs settings.active=Aktīvs
@ -1028,6 +1037,7 @@ auths.delete_auth_title=Autentifikācijas dzēšana
auths.delete_auth_desc=Šī autentifikācija tiks dzēsta, vai vēlaties turpināt? auths.delete_auth_desc=Šī autentifikācija tiks dzēsta, vai vēlaties turpināt?
auths.still_in_used=Daži lietotāji joprojām izmanto šo autentifikācijas veidu. Nepieciešams veikt šo lietotāju konvertāciju vai dzēšanu. auths.still_in_used=Daži lietotāji joprojām izmanto šo autentifikācijas veidu. Nepieciešams veikt šo lietotāju konvertāciju vai dzēšanu.
auths.deletion_success=Autentifikācija tika veiksmīgi izdzēsta! auths.deletion_success=Autentifikācija tika veiksmīgi izdzēsta!
auths.login_source_exist=Login source '%s' already exists.
config.server_config=Servera konfigurācija config.server_config=Servera konfigurācija
config.app_name=Lietotnes nosaukums config.app_name=Lietotnes nosaukums
@ -1113,18 +1123,18 @@ config.cookie_life_time=Sīkdatņu glabāšanas ilgums
config.picture_config=Attēlu konfigurācija config.picture_config=Attēlu konfigurācija
config.picture_service=Lokāli attēli config.picture_service=Lokāli attēli
config.disable_gravatar=Atspējot Gravatar config.disable_gravatar=Atspējot Gravatar
config.enable_federated_avatar=Enable Federated Avatars config.enable_federated_avatar=Iespējot apvienotās profila bildes
config.git_config=Git konfigurācija config.git_config=Git konfigurācija
config.git_disable_diff_highlight=Disable Diff Syntax Highlight config.git_disable_diff_highlight=Atspējot salīdzināšanas sintakses iekrāsošanu
config.git_max_diff_lines=Max Diff Lines (for a single file) config.git_max_diff_lines=Maksimālais salīdzināmo rindu skaits vienam failam
config.git_max_diff_line_characters=Max Diff Characters (for a single line) config.git_max_diff_line_characters=Maksimālais salīdzināmo simbolu skaits vienai rindai
config.git_max_diff_files=Max Diff Files (to be shown) config.git_max_diff_files=Maksimālais salīdzināmo failu skaits, ko attēlot
config.git_gc_args=GC argumenti config.git_gc_args=GC argumenti
config.git_migrate_timeout=Migrācijas noilgums config.git_migrate_timeout=Migrācijas noilgums
config.git_mirror_timeout=Mirror Update Timeout config.git_mirror_timeout=Spoguļa atjaunošanas noilgums
config.git_clone_timeout=Clone Operation Timeout config.git_clone_timeout=Klonēšanas darbības noilgums
config.git_pull_timeout=Pull Operation Timeout config.git_pull_timeout=Izmaiņu saņemšanas darbības noilgums
config.git_gc_timeout=GC darbības noilgums config.git_gc_timeout=GC darbības noilgums
config.log_config=Žurnalizēšanas konfigurācija config.log_config=Žurnalizēšanas konfigurācija

70
conf/locale/locale_nl-NL.ini

@ -126,7 +126,7 @@ uname_holder=Gebruikersnaam of e-mail
password_holder=Wachtwoord password_holder=Wachtwoord
switch_dashboard_context=Wissel voorpaginacontext switch_dashboard_context=Wissel voorpaginacontext
my_repos=Mijn repositories my_repos=Mijn repositories
show_more_repos=Show more repositories... show_more_repos=Toon meer repositories...
collaborative_repos=Gedeelde repositories collaborative_repos=Gedeelde repositories
my_orgs=Mijn organisaties my_orgs=Mijn organisaties
my_mirrors=Mijn mirrors my_mirrors=Mijn mirrors
@ -137,6 +137,7 @@ issues.in_your_repos=In uw repositories
[explore] [explore]
repos=Repositories repos=Repositories
users=Gebruikers users=Gebruikers
organizations=Organizations
search=Zoeken search=Zoeken
[auth] [auth]
@ -156,7 +157,6 @@ prohibit_login_desc=Your account is prohibited to login, please contact site adm
resent_limit_prompt=Sorry, u heeft te snel na elkaar een aanvraag gedaan voor een activatie mail. Wacht drie minuten voor uw volgende aanvraag. resent_limit_prompt=Sorry, u heeft te snel na elkaar een aanvraag gedaan voor een activatie mail. Wacht drie minuten voor uw volgende aanvraag.
has_unconfirmed_mail=Beste %s, u heeft een onbevestigd e-mailadres (<b>%s</b>). Als u nog geen bevestiging heeft ontvangen, of u een nieuwe aanvraag wilt doen, klik dan op de onderstaande knop. has_unconfirmed_mail=Beste %s, u heeft een onbevestigd e-mailadres (<b>%s</b>). Als u nog geen bevestiging heeft ontvangen, of u een nieuwe aanvraag wilt doen, klik dan op de onderstaande knop.
resend_mail=Klik hier om uw activatie mail nog een keer te verzenden resend_mail=Klik hier om uw activatie mail nog een keer te verzenden
email_not_associate=Dit e-mailadres is niet gekoppeld aan een account.
send_reset_mail=Klik hier om uw wachtwoord reset mail (nogmaals) te versturen send_reset_mail=Klik hier om uw wachtwoord reset mail (nogmaals) te versturen
reset_password=Reset uw wachtwoord reset_password=Reset uw wachtwoord
invalid_code=Sorry, uw bevestigingscode is verlopen of niet meer geldig. invalid_code=Sorry, uw bevestigingscode is verlopen of niet meer geldig.
@ -189,12 +189,12 @@ TeamName=Team naam
AuthName=Autorisatienaam AuthName=Autorisatienaam
AdminEmail=E-mail beheerder AdminEmail=E-mail beheerder
NewBranchName=New branch name NewBranchName=Nieuwe branch naam
CommitSummary=Commit summary CommitSummary=Commit samenvatting
CommitMessage=Commit message CommitMessage=Commit bericht
CommitChoice=Commit choice CommitChoice=Commit choice
TreeName=File path TreeName=Bestandspad
Content=Content Content=Inhoud
require_error=kan niet leeg zijn. require_error=kan niet leeg zijn.
alpha_dash_error=moet een valide alfanumeriek of dash(-_) karakter zijn. alpha_dash_error=moet een valide alfanumeriek of dash(-_) karakter zijn.
@ -232,7 +232,7 @@ org_still_own_repo=De organisatie heeft nog eigendomen op repositories. U moet d
target_branch_not_exist=Doel branch bestaat niet target_branch_not_exist=Doel branch bestaat niet
[user] [user]
change_avatar=Change your avatar change_avatar=Wijzig je profielfoto
join_on=Aangemeld op join_on=Aangemeld op
repositories=repositories repositories=repositories
activity=Openbare activiteit activity=Openbare activiteit
@ -248,7 +248,7 @@ form.name_pattern_not_allowed=Het gebruikersnaam patroon '%s' is niet toegestaan
[settings] [settings]
profile=Profiel profile=Profiel
password=Wachtwoord password=Wachtwoord
avatar=Avatar avatar=Profielfoto
ssh_keys=SSH-sleutels ssh_keys=SSH-sleutels
social=Sociale netwerk-accounts social=Sociale netwerk-accounts
applications=Toepassingen applications=Toepassingen
@ -269,7 +269,7 @@ change_username_prompt=Deze verandering zal de weg links hebben betrekking op uw
continue=Doorgaan continue=Doorgaan
cancel=Annuleren cancel=Annuleren
lookup_avatar_by_mail=Lookup Avatar by mail lookup_avatar_by_mail=Zoek profielfoto per email
federated_avatar_lookup=Federated Avatar Lookup federated_avatar_lookup=Federated Avatar Lookup
enable_custom_avatar=Aangepaste avatar inschakelen enable_custom_avatar=Aangepaste avatar inschakelen
choose_new_avatar=Kies een nieuwe avatar choose_new_avatar=Kies een nieuwe avatar
@ -337,6 +337,10 @@ access_token_deletion=Persoonlijke toegang token verwijderen
access_token_deletion_desc=Verwijderen van deze persoonlijke toegang token zal alle verwante toegang verwijderen. Wilt u doorgaan? access_token_deletion_desc=Verwijderen van deze persoonlijke toegang token zal alle verwante toegang verwijderen. Wilt u doorgaan?
delete_token_success=Persoonlijke toegangstoken is met succes verwijderd! Vergeet niet uw toepassingen ook bij te werken. delete_token_success=Persoonlijke toegangstoken is met succes verwijderd! Vergeet niet uw toepassingen ook bij te werken.
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=Verwijder uw account delete_account=Verwijder uw account
delete_prompt=Deze handeling zal uw account definitief verwijderen, u kunt dit <strong> NIET </strong> terug draaien! delete_prompt=Deze handeling zal uw account definitief verwijderen, u kunt dit <strong> NIET </strong> terug draaien!
confirm_delete_account=Bevestig verwijdering confirm_delete_account=Bevestig verwijdering
@ -357,7 +361,7 @@ fork_from=Afsplitsing van
fork_visiblity_helper=U kunt de zichtbaarheid van een geforkte repository niet aanpassen. fork_visiblity_helper=U kunt de zichtbaarheid van een geforkte repository niet aanpassen.
repo_desc=Omschrijving repo_desc=Omschrijving
repo_lang=Taal repo_lang=Taal
repo_gitignore_helper=Select .gitignore templates repo_gitignore_helper=Selecteer .gitignore sjablonen
license=Licentie license=Licentie
license_helper=Selecteer een licentie bestand license_helper=Selecteer een licentie bestand
readme=Leesmij-bestand readme=Leesmij-bestand
@ -365,12 +369,12 @@ readme_helper=Selecteer een sjabloon voor het Leesmij-bestand
auto_init=Initialiseer deze repositorie met de geselecteerde bestanden en sjabloon auto_init=Initialiseer deze repositorie met de geselecteerde bestanden en sjabloon
create_repo=Nieuwe repository create_repo=Nieuwe repository
default_branch=Standaard branch default_branch=Standaard branch
mirror_prune=Prune mirror_prune=Opschonen
mirror_prune_desc=Remove any remote-tracking references that no longer exist on the remote mirror_prune_desc=Remove any remote-tracking references that no longer exist on the remote
mirror_interval=Mirror interval(uur) mirror_interval=Mirror interval(uur)
mirror_address=Kopie-adres mirror_address=Kopie-adres
mirror_address_desc=Gelieve noodzakelijke gebruikersgegevens in de adresbalk. mirror_address_desc=Gelieve noodzakelijke gebruikersgegevens in de adresbalk.
mirror_last_synced=Last Synced mirror_last_synced=Laatste synchronisatie
watchers=Volgers watchers=Volgers
stargazers=Stargazers stargazers=Stargazers
forks=Forks forks=Forks
@ -384,7 +388,8 @@ migrate_type=Migratie type
migrate_type_helper=Deze repositorie zal een <span class="text blue">mirror</span> zijn migrate_type_helper=Deze repositorie zal een <span class="text blue">mirror</span> zijn
migrate_repo=Migreer repositorie migrate_repo=Migreer repositorie
migrate.clone_address=Clone adres migrate.clone_address=Clone adres
migrate.clone_address_desc=Dit kan een HTTP/HTTPS/GIT URL zijn of een lokaal pad. migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=U bent niet toegestaan om deze lokale repositories te importeren. migrate.permission_denied=U bent niet toegestaan om deze lokale repositories te importeren.
migrate.invalid_local_path=Ongeldig lokaal pad, het pad bestaat niet of het is geen map. migrate.invalid_local_path=Ongeldig lokaal pad, het pad bestaat niet of het is geen map.
migrate.failed=Migratie is mislukt: %v migrate.failed=Migratie is mislukt: %v
@ -409,7 +414,7 @@ create_new_repo_command=Maak een nieuwe repositorie aan vanaf de console
push_exist_repo=Push een bestaande repositorie vanaf de console push_exist_repo=Push een bestaande repositorie vanaf de console
repo_is_empty=Deze repositories is leeg is, probeer het later opnieuw! repo_is_empty=Deze repositories is leeg is, probeer het later opnieuw!
code=Code files=Files
branch=Aftakking branch=Aftakking
tree=Boom tree=Boom
filter_branch_and_tag=Filter branch of tag filter_branch_and_tag=Filter branch of tag
@ -425,23 +430,24 @@ file_raw=Ruwe
file_history=Geschiedenis file_history=Geschiedenis
file_view_raw=Weergave ruwe file_view_raw=Weergave ruwe
file_permalink=Permalink file_permalink=Permalink
file_too_large=This file is too large to be shown file_too_large=Dit bestand is te groot om te worden getoond
video_not_supported_in_browser=Your browser doesn't support HTML5 video tag.
editor.new_file=New file
editor.upload_file=Upload file editor.new_file=Nieuw bestand
editor.edit_file=Edit file editor.upload_file=Bestand uploaden
editor.preview_changes=Preview Changes editor.edit_file=Bewerk bestand
editor.cannot_edit_non_text_files=Cannot edit non-text files editor.preview_changes=Wijzigingen nagaan
editor.edit_this_file=Edit this file editor.cannot_edit_non_text_files=Kan niet-tekstbestanden niet bewerken
editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file editor.edit_this_file=Bestand aanpassen
editor.fork_before_edit=You must fork this repository before editing the file editor.must_be_on_a_branch=Je moet in een branch zijn om aanpassingen te maken of voor te stellen
editor.delete_this_file=Delete this file editor.fork_before_edit=Je moet deze repository eerst vorken om dit bestand aan te kunnen passen
editor.delete_this_file=Verwijder dit bestand
editor.must_have_write_access=You must have write access to make or propose changes to this file editor.must_have_write_access=You must have write access to make or propose changes to this file
editor.file_delete_success=File '%s' has been deleted successfully! editor.file_delete_success=Bestand '%s' is succesvol verwijderd!
editor.name_your_file=Name your file... editor.name_your_file=Name your file...
editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace.
editor.or=or editor.or=of
editor.cancel_lower=cancel editor.cancel_lower=annuleren
editor.commit_changes=Commit Changes editor.commit_changes=Commit Changes
editor.add_tmpl=Add '%s/<filename>' editor.add_tmpl=Add '%s/<filename>'
editor.add=Add '%s' editor.add=Add '%s'
@ -455,6 +461,7 @@ editor.cancel=Cancel
editor.filename_cannot_be_empty=Filename cannot be empty. editor.filename_cannot_be_empty=Filename cannot be empty.
editor.branch_already_exists=Branch '%s' already exists in this repository. editor.branch_already_exists=Branch '%s' already exists in this repository.
editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository.
editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor.
editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository.
editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository.
editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes. editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes.
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=Dit pull-request kan niet worden gemerged omdat er
pulls.cannot_auto_merge_helper=Gelieve beide versies manueel samen te voegen om de conflicten op te lossen. pulls.cannot_auto_merge_helper=Gelieve beide versies manueel samen te voegen om de conflicten op te lossen.
pulls.merge_pull_request=Samenvoegen van pull verzoek pulls.merge_pull_request=Samenvoegen van pull verzoek
pulls.open_unmerged_pull_exists=U kan de bewerking 'heropenen' niet uitvoeren omdat er al een pull-aanvraag (#%d) is van dezelfde repository met dezelfde informatie. Voeg deze eerst samen. pulls.open_unmerged_pull_exists=U kan de bewerking 'heropenen' niet uitvoeren omdat er al een pull-aanvraag (#%d) is van dezelfde repository met dezelfde informatie. Voeg deze eerst samen.
pulls.delete_branch=Delete Branch
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
milestones.new=Nieuwe mijlpaal milestones.new=Nieuwe mijlpaal
milestones.open_tab=%d geopend milestones.open_tab=%d geopend
@ -847,7 +856,7 @@ members.invite_desc=Voeg nieuw lid toe aan %s:
members.invite_now=Nu uitnodigen members.invite_now=Nu uitnodigen
teams.join=Lid worden teams.join=Lid worden
teams.leave=Vertlaat teams.leave=Verlaat
teams.read_access=Leestoegang teams.read_access=Leestoegang
teams.read_access_helper=Dit team is in staat om zijn repositories te bekijken en te klonen. teams.read_access_helper=Dit team is in staat om zijn repositories te bekijken en te klonen.
teams.write_access=Schrijf toegang teams.write_access=Schrijf toegang
@ -1028,6 +1037,7 @@ auths.delete_auth_title=Authenticatie verwijderd
auths.delete_auth_desc=Deze authenticatie zal verwijderd worden, wil je verdergaan? auths.delete_auth_desc=Deze authenticatie zal verwijderd worden, wil je verdergaan?
auths.still_in_used=This authentication is still used by some users, please delete or convert these users to another login type first. auths.still_in_used=This authentication is still used by some users, please delete or convert these users to another login type first.
auths.deletion_success=Authentication has been deleted successfully! auths.deletion_success=Authentication has been deleted successfully!
auths.login_source_exist=Login source '%s' already exists.
config.server_config=Serverconfiguratie config.server_config=Serverconfiguratie
config.app_name=Applicatienaam config.app_name=Applicatienaam

190
conf/locale/locale_pl-PL.ini

@ -60,7 +60,7 @@ ssl_mode=Tryb SSL
path=Ścieżka path=Ścieżka
sqlite_helper=Ścieżka do pliku bazy danych SQLite3 lub TiDB. <br>Proszę użyć ścieżki bezwzględnej podczas uruchamiania usługi. sqlite_helper=Ścieżka do pliku bazy danych SQLite3 lub TiDB. <br>Proszę użyć ścieżki bezwzględnej podczas uruchamiania usługi.
err_empty_db_path=Ścieżka do bazy danych SQLite3 lub TiDB nie może być pusta. err_empty_db_path=Ścieżka do bazy danych SQLite3 lub TiDB nie może być pusta.
err_invalid_tidb_name=Nazwa bazy danych TiDB nie może zawierać znaków "." i "-". err_invalid_tidb_name=Nazwa bazy danych TiDB nie może zawierać znaków „.” i „-”.
no_admin_and_disable_registration=Rejestracji nie można wyłączyć bez tworzenia konta admina. no_admin_and_disable_registration=Rejestracji nie można wyłączyć bez tworzenia konta admina.
err_empty_admin_password=Hasło admina nie może być puste. err_empty_admin_password=Hasło admina nie może być puste.
@ -86,7 +86,7 @@ optional_title=Ustawienia opcjonalne
email_title=Ustawienia serwera e-mail email_title=Ustawienia serwera e-mail
smtp_host=Serwer SMTP smtp_host=Serwer SMTP
smtp_from=Od smtp_from=Od
smtp_from_helper=Adres w polu "Od", zgodnie z RFC 5322. Może być to po prostu adres email, bądź adres w formacie "Nazwa" <email@example.com>. smtp_from_helper=Adres w polu „Od”, zgodnie z RFC 5322. Może być to po prostu adres email, bądź adres w formacie „Nazwa” <email@example.com>.
mailer_user=E-mail nadawcy mailer_user=E-mail nadawcy
mailer_password=Hasło nadawcy mailer_password=Hasło nadawcy
register_confirm=Włącz potwierdzenia rejestracji register_confirm=Włącz potwierdzenia rejestracji
@ -111,7 +111,7 @@ admin_password=Hasło
confirm_password=Potwierdź hasło confirm_password=Potwierdź hasło
admin_email=E-mail administratora admin_email=E-mail administratora
install_gogs=Zainstaluj Gogs install_gogs=Zainstaluj Gogs
test_git_failed=Nie udało się przetestować polecenia "git": %v test_git_failed=Nie udało się przetestować polecenia „git”: %v
sqlite3_not_available=Twoje wydanie nie obsługuje SQLite3, proszę pobrać oficjalne wydanie z %s, a NIE wersję z gobuild. sqlite3_not_available=Twoje wydanie nie obsługuje SQLite3, proszę pobrać oficjalne wydanie z %s, a NIE wersję z gobuild.
invalid_db_setting=Ustawienia bazy danych nie są poprawne: %v invalid_db_setting=Ustawienia bazy danych nie są poprawne: %v
invalid_repo_path=Ścieżka repozytoriów nie jest poprawna: %v invalid_repo_path=Ścieżka repozytoriów nie jest poprawna: %v
@ -137,6 +137,7 @@ issues.in_your_repos=W Twoich repozytoriach
[explore] [explore]
repos=Repozytoria repos=Repozytoria
users=Użytkownicy users=Użytkownicy
organizations=Organizations
search=Wyszukiwanie search=Wyszukiwanie
[auth] [auth]
@ -156,7 +157,6 @@ prohibit_login_desc=Nie możesz się zalogować na to konto, skontaktuj się z
resent_limit_prompt=Niestety, zbyt często wysyłasz e-mail aktywacyjny. Proszę odczekać 3 minuty. resent_limit_prompt=Niestety, zbyt często wysyłasz e-mail aktywacyjny. Proszę odczekać 3 minuty.
has_unconfirmed_mail=Witaj, %s, masz niepotwierdzony adres e-mail (<b>%s</b>). Jeśli nie otrzymałeś wiadomości e-mail z potwierdzeniem lub potrzebujesz wysłać nową, kliknij na poniższy przycisk. has_unconfirmed_mail=Witaj, %s, masz niepotwierdzony adres e-mail (<b>%s</b>). Jeśli nie otrzymałeś wiadomości e-mail z potwierdzeniem lub potrzebujesz wysłać nową, kliknij na poniższy przycisk.
resend_mail=Kliknij tutaj, aby wysłać e-mail aktywacyjny resend_mail=Kliknij tutaj, aby wysłać e-mail aktywacyjny
email_not_associate=Ten adres e-mail nie jest skojarzony z żadnym kontem.
send_reset_mail=Kliknij tutaj, aby (ponownie) wysłać e-mail z instrukcjami resetowania hasła send_reset_mail=Kliknij tutaj, aby (ponownie) wysłać e-mail z instrukcjami resetowania hasła
reset_password=Resetowanie hasła reset_password=Resetowanie hasła
invalid_code=Niestety, Twój kod potwierdzający wygasł lub jest nieprawidłowy. invalid_code=Niestety, Twój kod potwierdzający wygasł lub jest nieprawidłowy.
@ -189,12 +189,12 @@ TeamName=Nazwa zespołu
AuthName=Nazwa autoryzacji AuthName=Nazwa autoryzacji
AdminEmail=E-mail administratora AdminEmail=E-mail administratora
NewBranchName=New branch name NewBranchName=Nazwa nowej gałęzi
CommitSummary=Commit summary CommitSummary=Podsumowanie commitu
CommitMessage=Commit message CommitMessage=Wiadomość commitu
CommitChoice=Commit choice CommitChoice=Wybór commitu
TreeName=File path TreeName=Ścieżka pliku
Content=Content Content=Treść
require_error=` nie może być puste.` require_error=` nie może być puste.`
alpha_dash_error=` musi się składać z prawidłowych znaków alfanumerycznych, myślników oraz podkreśleń.` alpha_dash_error=` musi się składać z prawidłowych znaków alfanumerycznych, myślników oraz podkreśleń.`
@ -242,13 +242,13 @@ following=Obserwowani
follow=Obserwuj follow=Obserwuj
unfollow=Przestań obserwować unfollow=Przestań obserwować
form.name_reserved=Nazwa użytkownika "%s" jest zarezerwowana. form.name_reserved=Nazwa użytkownika „%s” jest zarezerwowana.
form.name_pattern_not_allowed=Wzorzec nazwy użytkownika "%s" jest niedozwolony. form.name_pattern_not_allowed=Wzorzec nazwy użytkownika „%s” jest niedozwolony.
[settings] [settings]
profile=Profil profile=Profil
password=Hasło password=Hasło
avatar=Avatar avatar=Awatar
ssh_keys=Klucze SSH ssh_keys=Klucze SSH
social=Konta społecznościowe social=Konta społecznościowe
applications=Aplikacje applications=Aplikacje
@ -269,7 +269,7 @@ change_username_prompt=Ta zmiana wpłynie na sposób w jaki łącza odnoszą si
continue=Kontynuuj continue=Kontynuuj
cancel=Anuluj cancel=Anuluj
lookup_avatar_by_mail=Lookup Avatar by mail lookup_avatar_by_mail=Wyszukaj Avatar po mailu
federated_avatar_lookup=Federated Avatar Lookup federated_avatar_lookup=Federated Avatar Lookup
enable_custom_avatar=Włącz niestandardowe awatary enable_custom_avatar=Włącz niestandardowe awatary
choose_new_avatar=Wybierz nowy avatar choose_new_avatar=Wybierz nowy avatar
@ -337,6 +337,10 @@ access_token_deletion=Usuwanie osobistego tokena dostępu
access_token_deletion_desc=Usunięcie tego tokena osobistego dostęp spowoduje usunięcie wszystkich powiązanych dostępów do aplikacji. Czy chcesz kontynuować? access_token_deletion_desc=Usunięcie tego tokena osobistego dostęp spowoduje usunięcie wszystkich powiązanych dostępów do aplikacji. Czy chcesz kontynuować?
delete_token_success=Osobisty token dostępu został usunięty pomyślnie! Nie zapomnij również zaktualizować swoich aplikacji. delete_token_success=Osobisty token dostępu został usunięty pomyślnie! Nie zapomnij również zaktualizować swoich aplikacji.
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=Usuń swoje konto delete_account=Usuń swoje konto
delete_prompt=Ta operacja trwale usunie Twoje konto i <strong>NIE MOŻE</strong> zostać cofnięta! delete_prompt=Ta operacja trwale usunie Twoje konto i <strong>NIE MOŻE</strong> zostać cofnięta!
confirm_delete_account=Potwierdź usunięcie confirm_delete_account=Potwierdź usunięcie
@ -357,7 +361,7 @@ fork_from=Forkuj z
fork_visiblity_helper=Fork nie może zmieniać swojej widoczności fork_visiblity_helper=Fork nie może zmieniać swojej widoczności
repo_desc=Opis repo_desc=Opis
repo_lang=Język repo_lang=Język
repo_gitignore_helper=Select .gitignore templates repo_gitignore_helper=Wybierz szablony pliku .gitignore
license=Licencja license=Licencja
license_helper=Wybierz plik licencji license_helper=Wybierz plik licencji
readme=Readme readme=Readme
@ -370,21 +374,22 @@ mirror_prune_desc=Usuń wszystkie śledzone odwołania które nie istnieją w zd
mirror_interval=Częstotliwość kopiowania (godziny) mirror_interval=Częstotliwość kopiowania (godziny)
mirror_address=Adres kopii lustrzanej mirror_address=Adres kopii lustrzanej
mirror_address_desc=Proszę podać wymagane poświadczenia użytkownika w adresie. mirror_address_desc=Proszę podać wymagane poświadczenia użytkownika w adresie.
mirror_last_synced=Last Synced mirror_last_synced=Ostatnia synchronizacja
watchers=Obserwujący watchers=Obserwujący
stargazers=Polubienia stargazers=Polubienia
forks=Forki forks=Forki
form.reach_limit_of_creation=Właściciel osiągnął limit maksymalnej ilości repozytoriów %d. form.reach_limit_of_creation=Właściciel osiągnął limit maksymalnej ilości repozytoriów %d.
form.name_reserved=Nazwa repozytorium "%s" jest zarezerwowana. form.name_reserved=Nazwa repozytorium „%s” jest zarezerwowana.
form.name_pattern_not_allowed=Wzorzec nazwy repozytorium "%s" jest niedozwolony. form.name_pattern_not_allowed=Wzorzec nazwy repozytorium „%s” jest niedozwolony.
need_auth=Wymaga autoryzacji need_auth=Wymaga autoryzacji
migrate_type=Typ migracji migrate_type=Typ migracji
migrate_type_helper=To repozytorium będzie <span class="text blue">kopią lustrzaną</span> migrate_type_helper=To repozytorium będzie <span class="text blue">kopią lustrzaną</span>
migrate_repo=Przenieś repozytorium migrate_repo=Przenieś repozytorium
migrate.clone_address=Sklonuj adres migrate.clone_address=Sklonuj adres
migrate.clone_address_desc=To może być adres HTTP/HTTPS/GIT lub ścieżka lokalna serwera. migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=Nie możesz importować lokalnych repozytoriów. migrate.permission_denied=Nie możesz importować lokalnych repozytoriów.
migrate.invalid_local_path=Ścieżka jest niepoprawna. Nie istnieje lub nie jest katalogiem. migrate.invalid_local_path=Ścieżka jest niepoprawna. Nie istnieje lub nie jest katalogiem.
migrate.failed=Migracja nie powiodła się: %v migrate.failed=Migracja nie powiodła się: %v
@ -409,7 +414,7 @@ create_new_repo_command=Utwórz nowe repozytorium z wiersza poleceń
push_exist_repo=Prześlij istniejące repozytorium z wiersza poleceń push_exist_repo=Prześlij istniejące repozytorium z wiersza poleceń
repo_is_empty=To repozytorium jest puste, proszę wrócić później! repo_is_empty=To repozytorium jest puste, proszę wrócić później!
code=Kod files=Files
branch=Gałąź branch=Gałąź
tree=Drzewo tree=Drzewo
filter_branch_and_tag=Filtruj gałąź lub tag filter_branch_and_tag=Filtruj gałąź lub tag
@ -426,44 +431,46 @@ file_history=Historia
file_view_raw=Zobacz czysty file_view_raw=Zobacz czysty
file_permalink=Bezpośredni odnośnik file_permalink=Bezpośredni odnośnik
file_too_large=Ten plik jest zbyt duży, aby go wyświetlić file_too_large=Ten plik jest zbyt duży, aby go wyświetlić
video_not_supported_in_browser=Your browser doesn't support HTML5 video tag.
editor.new_file=New file
editor.upload_file=Upload file editor.new_file=Nowy plik
editor.edit_file=Edit file editor.upload_file=Załaduj plik
editor.preview_changes=Preview Changes editor.edit_file=Edytuj plik
editor.cannot_edit_non_text_files=Cannot edit non-text files editor.preview_changes=Podgląd zmian
editor.edit_this_file=Edit this file editor.cannot_edit_non_text_files=Nie można edytować plików nietekstowych
editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file editor.edit_this_file=Edytuj ten plik
editor.fork_before_edit=You must fork this repository before editing the file editor.must_be_on_a_branch=Musisz być na gałęzi aby zgłosić lub zaproponować zmiany do tego pliku
editor.delete_this_file=Delete this file editor.fork_before_edit=Musisz sforkować to repozytorium przed edycją tego pliku
editor.must_have_write_access=You must have write access to make or propose changes to this file editor.delete_this_file=Usuń ten plik
editor.file_delete_success=File '%s' has been deleted successfully! editor.must_have_write_access=Musisz mieć uprawnienia do zapisu aby zgłosić lub zaproponować zmiany do tego pliku
editor.name_your_file=Name your file... editor.file_delete_success=Plik '%s' został usunięty pomyślnie!
editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. editor.name_your_file=Nazwij plik...
editor.or=or editor.filename_help=Aby dodać katalog, wpisz nazwę i naciśnij przycisk /. Aby usunąć katalog, przejdź do początku pola i naciśnij klawisz backspace.
editor.cancel_lower=cancel editor.or=lub
editor.commit_changes=Commit Changes editor.cancel_lower=anuluj
editor.add_tmpl=Add '%s/<filename>' editor.commit_changes=Zatwierdź zmiany
editor.add=Add '%s' editor.add_tmpl=Dodaj '%s/<filename>'
editor.update=Update '%s' editor.add=Dodaj '%s'
editor.delete=Delete '%s' editor.update=Zaktualizuj '%s'
editor.commit_message_desc=Add an optional extended description... editor.delete=Usuń '%s'
editor.commit_directly_to_this_branch=Commit directly to the <strong class="branch-name">%s</strong> branch. editor.commit_message_desc=Dodaj dodatkowy rozszerzony opis...
editor.create_new_branch=Create a <strong>new branch</strong> for this commit and start a pull request. editor.commit_directly_to_this_branch=Commituj bezpośrednio do gałęzi <strong class="branch-name">%s</strong>.
editor.new_branch_name_desc=New branch name... editor.create_new_branch=Stwórz <strong>nową gałąź</strong> dla tego commita i rozpocznij pull request.
editor.cancel=Cancel editor.new_branch_name_desc=Nazwa nowej gałęzi...
editor.filename_cannot_be_empty=Filename cannot be empty. editor.cancel=Anuluj
editor.branch_already_exists=Branch '%s' already exists in this repository. editor.filename_cannot_be_empty=Nazwa pliku nie może być pusta.
editor.branch_already_exists=Gałąź '%s' już istnieje w tym repozytorium.
editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository.
editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor.
editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. editor.filename_is_a_directory=Nazwa '%s' jest istniejącym katalogiem w tym repozytorium.
editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes. editor.file_editing_no_longer_exists=Plik '%s' który edytujesz nie istnieje już w tym repozytorium.
editor.file_already_exists=A file with name '%s' already exists in this repository. editor.file_changed_while_editing=Zawartość pliku została zmieniona od rozpoczęcia edycji. <a target="_blank" href="%s">Kliknij tutaj</a> aby zobaczyć, co zostało zmienione lub <strong>naciśnij commit ponownie</strong> aby nadpisać te zmiany.
editor.no_changes_to_show=There are no changes to show. editor.file_already_exists=Nazwa pliku '%s' już istnieje w tym repozytorium.
editor.fail_to_update_file=Failed to update/create file '%s' with error: %v editor.no_changes_to_show=Brak zmian do pokazania.
editor.add_subdir=Add subdirectory... editor.fail_to_update_file=Tworzenie/aktualizacja pliku '%s' nie powiodła się z błędem: %v
editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v editor.add_subdir=Dodaj podkatalog...
editor.upload_files_to_dir=Upload files to '%s' editor.unable_to_upload_files=Wysyłanie plików do '%s' nie powiodło się z błędem: %v
editor.upload_files_to_dir=Prześlij pliki do '%s'
commits.commits=Commity commits.commits=Commity
commits.search=Przeszukaj commity commits.search=Przeszukaj commity
@ -490,11 +497,11 @@ issues.create=Utwórz problem
issues.new_label=Nowa etykieta issues.new_label=Nowa etykieta
issues.new_label_placeholder=Etykieta... issues.new_label_placeholder=Etykieta...
issues.create_label=Utwórz etykietę issues.create_label=Utwórz etykietę
issues.label_templates.title=Load a predefined set of labels issues.label_templates.title=Załaduj wstępnie przygotowany zestaw etykiet
issues.label_templates.info=There aren’t any labels yet. You can click on the "New Label" button above to create one or use a predefined set below. issues.label_templates.info=Nie ma jeszcze żadnych etykiet. Kliknij na przycisk „Nowa etykieta” powyżej, aby utworzyć lub użyć poniższego zestawu wstępnie zdefiniowanego.
issues.label_templates.helper=Select a label set issues.label_templates.helper=Wybierz zestaw etykiet
issues.label_templates.use=Use this label set issues.label_templates.use=Użyj ten zestaw etykiet
issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v issues.label_templates.fail_to_load_file=Ładowanie pliku szablonu etykiety '%s' nie powiodło się: %v
issues.open_tab=Otwarte %d issues.open_tab=Otwarte %d
issues.close_tab=Zamknięte %d issues.close_tab=Zamknięte %d
issues.filter_label=Etykieta issues.filter_label=Etykieta
@ -536,7 +543,7 @@ issues.commit_ref_at=`wspomina ten problem w commicie <a id="%[1]s" href="#%[1]s
issues.poster=Autor issues.poster=Autor
issues.collaborator=Współpracownik issues.collaborator=Współpracownik
issues.owner=Właściciel issues.owner=Właściciel
issues.sign_in_require_desc=<a href="%s">Sign in</a> to join this conversation. issues.sign_in_require_desc=<a href="%s"> Zaloguj się</a>, aby dołączyć do tej rozmowy.
issues.edit=Edytuj issues.edit=Edytuj
issues.cancel=Anuluj issues.cancel=Anuluj
issues.save=Zapisz issues.save=Zapisz
@ -551,8 +558,8 @@ issues.label_deletion=Usunięcie etykiety
issues.label_deletion_desc=Usunięcie tej etykiety spowoduje usuniecie jej ze wszystkich powiązanych problemów. Czy na pewno chcesz kontynuować? issues.label_deletion_desc=Usunięcie tej etykiety spowoduje usuniecie jej ze wszystkich powiązanych problemów. Czy na pewno chcesz kontynuować?
issues.label_deletion_success=Etykieta została usunięta pomyślnie! issues.label_deletion_success=Etykieta została usunięta pomyślnie!
issues.num_participants=%d uczestników issues.num_participants=%d uczestników
issues.attachment.open_tab=`Click to see "%s" in a new tab` issues.attachment.open_tab=`Kliknij, aby zobaczyć „%s” w nowej karcie`
issues.attachment.download=`Click to download "%s"` issues.attachment.download=`Kliknij, aby pobrać „%s”`
pulls.new=Nowy pull request pulls.new=Nowy pull request
pulls.compare_changes=Porównaj zmiany pulls.compare_changes=Porównaj zmiany
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=Pull request nie może być automatycznie scalony z
pulls.cannot_auto_merge_helper=Proszę scalić ręcznie, aby rozwiązać konflikty. pulls.cannot_auto_merge_helper=Proszę scalić ręcznie, aby rozwiązać konflikty.
pulls.merge_pull_request=Scal Pull Request pulls.merge_pull_request=Scal Pull Request
pulls.open_unmerged_pull_exists=`Nie można otworzyć ponownie ponieważ już istnieje gotowy do scalenia pull request (#%d) z tego samego repozytorium z tymi samymi informacjami.` pulls.open_unmerged_pull_exists=`Nie można otworzyć ponownie ponieważ już istnieje gotowy do scalenia pull request (#%d) z tego samego repozytorium z tymi samymi informacjami.`
pulls.delete_branch=Delete Branch
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
milestones.new=Nowy kamień milowy milestones.new=Nowy kamień milowy
milestones.open_tab=Otwarte %d milestones.open_tab=Otwarte %d
@ -594,7 +603,7 @@ milestones.desc=Opis
milestones.due_date=Termin realizacji (opcjonalnie) milestones.due_date=Termin realizacji (opcjonalnie)
milestones.clear=Wyczyść milestones.clear=Wyczyść
milestones.invalid_due_date_format=Format daty realizacji jest nieprawidłowy, musi być "rrrr-mm-dd". milestones.invalid_due_date_format=Format daty realizacji jest nieprawidłowy, musi być "rrrr-mm-dd".
milestones.create_success=Kamień milowy "%s" został utworzony pomyślnie! milestones.create_success=Kamień milowy „%s” został utworzony pomyślnie!
milestones.edit=Edytuj kamień milowy milestones.edit=Edytuj kamień milowy
milestones.edit_subheader=Użyj lepszego opisu, tak aby nie wprowadzać w błąd użytkowników. milestones.edit_subheader=Użyj lepszego opisu, tak aby nie wprowadzać w błąd użytkowników.
milestones.cancel=Anuluj milestones.cancel=Anuluj
@ -617,7 +626,7 @@ wiki.last_commit_info=%s edytuje tę stronę %s
wiki.edit_page_button=Edytuj wiki.edit_page_button=Edytuj
wiki.new_page_button=Nowa strona wiki.new_page_button=Nowa strona
wiki.delete_page_button=Usuń stronę wiki.delete_page_button=Usuń stronę
wiki.delete_page_notice_1=Strona zostanie usunięta <code>"%s"</code>. Bądź ostrożny. wiki.delete_page_notice_1=Strona zostanie usunięta <code>„%s”</code>. Bądź ostrożny.
wiki.page_already_exists=Strona Wiki o tej samej nazwie już istnieje. wiki.page_already_exists=Strona Wiki o tej samej nazwie już istnieje.
wiki.pages=Strony wiki.pages=Strony
wiki.last_updated=Ostatnia aktualizacja %s wiki.last_updated=Ostatnia aktualizacja %s
@ -632,20 +641,20 @@ settings.collaboration.undefined=Niezdefiniowany
settings.hooks=Webhooki settings.hooks=Webhooki
settings.githooks=Hooki Git settings.githooks=Hooki Git
settings.basic_settings=Ustawienia podstawowe settings.basic_settings=Ustawienia podstawowe
settings.mirror_settings=Mirror Settings settings.mirror_settings=Kopia lustrzana ustawień
settings.sync_mirror=Sync Now settings.sync_mirror=Synchronizuj teraz
settings.mirror_sync_in_progress=Mirror syncing is in progress, please refresh page in about a minute. settings.mirror_sync_in_progress=Synchronizacja kopii lustrzanej jest w toku, odśwież stronę w ciągu minuty.
settings.site=Oficjalna Strona settings.site=Oficjalna Strona
settings.update_settings=Aktualizuj ustawienia settings.update_settings=Aktualizuj ustawienia
settings.change_reponame_prompt=Zmiana nazwy repozytorium wpłynie na linki do niego. settings.change_reponame_prompt=Zmiana nazwy repozytorium wpłynie na linki do niego.
settings.advanced_settings=Ustawienia zaawansowane settings.advanced_settings=Ustawienia zaawansowane
settings.wiki_desc=Enable wiki system settings.wiki_desc=Włącz system wiki
settings.use_internal_wiki=Use builtin wiki settings.use_internal_wiki=Użyj wbudowanego wiki
settings.use_external_wiki=Użyj zewnętrznego Wiki settings.use_external_wiki=Użyj zewnętrznego Wiki
settings.external_wiki_url=Adres URL zewnętrznego Wiki settings.external_wiki_url=Adres URL zewnętrznego Wiki
settings.external_wiki_url_desc=Odwiedzający zostaną przekierowani do adresu URL po kliknięciu zakładki. settings.external_wiki_url_desc=Odwiedzający zostaną przekierowani do adresu URL po kliknięciu zakładki.
settings.issues_desc=Enable issue tracker settings.issues_desc=Włącz system zgłaszania problemów
settings.use_internal_issue_tracker=Use builtin lightweight issue tracker settings.use_internal_issue_tracker=Użyj wbudowany lekki system zgłaszania problemów
settings.use_external_issue_tracker=Użyj zewnętrznego systemu zgłaszania problemów settings.use_external_issue_tracker=Użyj zewnętrznego systemu zgłaszania problemów
settings.tracker_url_format=Format dla adresu URL zewnętrznego systemu settings.tracker_url_format=Format dla adresu URL zewnętrznego systemu
settings.tracker_issue_style=Styl nazw zewnętrznego systemu zgłaszania problemów: settings.tracker_issue_style=Styl nazw zewnętrznego systemu zgłaszania problemów:
@ -721,7 +730,7 @@ settings.event_choose=Pozwól mi wybrać, czego potrzebuję.
settings.event_create=Utwórz settings.event_create=Utwórz
settings.event_create_desc=Utworzono gałąź lub tag settings.event_create_desc=Utworzono gałąź lub tag
settings.event_pull_request=Pull Request settings.event_pull_request=Pull Request
settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. settings.event_pull_request_desc=Otworzono żądanie pull, zamknięto, otwarto ponownie, zaktualizowano, przypisano, nieprzypisano, zaktualizowano etykietę, wyczyszczono etykietę lub zsynchronizowano.
settings.event_push=Wypchnięcie settings.event_push=Wypchnięcie
settings.event_push_desc=Wypchnięcie (push) do repozytorium Git settings.event_push_desc=Wypchnięcie (push) do repozytorium Git
settings.active=Aktywny settings.active=Aktywny
@ -813,8 +822,8 @@ team_name_helper=Będziesz używał tej nazwy do wywoływania tego zespołu w dy
team_desc_helper=Czym zajmuje się ten zespół? team_desc_helper=Czym zajmuje się ten zespół?
team_permission_desc=Jaki poziom uprawnień powinien mieć ten zespół? team_permission_desc=Jaki poziom uprawnień powinien mieć ten zespół?
form.name_reserved=Nazwa organizacji "%s" jest zarezerwowana. form.name_reserved=Nazwa organizacji „%s” jest zarezerwowana.
form.name_pattern_not_allowed=Wzorzec nazwy organizacji "%s" jest niedozwolony. form.name_pattern_not_allowed=Wzorzec nazwy organizacji „%s” jest niedozwolony.
settings=Ustawienia settings=Ustawienia
settings.options=Opcje settings.options=Opcje
@ -1028,6 +1037,7 @@ auths.delete_auth_title=Usunięcie uwierzytelnienia
auths.delete_auth_desc=To uwierzytelnienie zostanie usunięte, czy chcesz kontynuować? auths.delete_auth_desc=To uwierzytelnienie zostanie usunięte, czy chcesz kontynuować?
auths.still_in_used=Ten rodzaj autentykacji jest wciąż wykorzystywany przez niektórych użytkowników. Usuń lub przekonwertuj użytkowników, aby wykorzystywali inny typ logowania. auths.still_in_used=Ten rodzaj autentykacji jest wciąż wykorzystywany przez niektórych użytkowników. Usuń lub przekonwertuj użytkowników, aby wykorzystywali inny typ logowania.
auths.deletion_success=Uwierzytelnienie zostało usunięte pomyślnie! auths.deletion_success=Uwierzytelnienie zostało usunięte pomyślnie!
auths.login_source_exist=Login source '%s' already exists.
config.server_config=Konfiguracja serwera config.server_config=Konfiguracja serwera
config.app_name=Nazwa aplikacji config.app_name=Nazwa aplikacji
@ -1062,9 +1072,9 @@ config.db_host=Host
config.db_name=Nazwa config.db_name=Nazwa
config.db_user=Użytkownik config.db_user=Użytkownik
config.db_ssl_mode=Tryb SSL config.db_ssl_mode=Tryb SSL
config.db_ssl_mode_helper=(tylko dla "postgres") config.db_ssl_mode_helper=(tylko dla „postgres”)
config.db_path=Ścieżka config.db_path=Ścieżka
config.db_path_helper=(dla "sqlite3" i "tidb") config.db_path_helper=(dla „sqlite3” i „tidb”)
config.service_config=Konfiguracja usługi config.service_config=Konfiguracja usługi
config.register_email_confirm=Wymagaj potwierdzenia e-mail config.register_email_confirm=Wymagaj potwierdzenia e-mail
@ -1115,17 +1125,17 @@ config.picture_service=Serwis obrazów
config.disable_gravatar=Wyłącz Gravatara config.disable_gravatar=Wyłącz Gravatara
config.enable_federated_avatar=Enable Federated Avatars config.enable_federated_avatar=Enable Federated Avatars
config.git_config=Git Configuration config.git_config=Konfiguracja Git
config.git_disable_diff_highlight=Disable Diff Syntax Highlight config.git_disable_diff_highlight=Wyłączyć wyróżnianie składni diff
config.git_max_diff_lines=Max Diff Lines (for a single file) config.git_max_diff_lines=Maksymalna ilość linii diff (dla pojedynczego pliku)
config.git_max_diff_line_characters=Max Diff Characters (for a single line) config.git_max_diff_line_characters=Maksymalna ilość znaków diff (dla pojedynczego pliku)
config.git_max_diff_files=Max Diff Files (to be shown) config.git_max_diff_files=Maksymalna ilość plików diff (które zostaną wyświetlone)
config.git_gc_args=GC Arguments config.git_gc_args=Argumenty GC
config.git_migrate_timeout=Migration Timeout config.git_migrate_timeout=Limit czasu migracji
config.git_mirror_timeout=Mirror Update Timeout config.git_mirror_timeout=Limit czasu aktualizacji kopii lustrzanej
config.git_clone_timeout=Clone Operation Timeout config.git_clone_timeout=Limit czasu operacji klonowania
config.git_pull_timeout=Pull Operation Timeout config.git_pull_timeout=Limit czasu dla operacji pull
config.git_gc_timeout=GC Operation Timeout config.git_gc_timeout=Limit czasu odśmiecania pamięci
config.log_config=Konfiguracja dziennika config.log_config=Konfiguracja dziennika
config.log_mode=Tryb dziennika config.log_mode=Tryb dziennika

662
conf/locale/locale_pt-BR.ini

File diff suppressed because it is too large Load Diff

100
conf/locale/locale_ru-RU.ini

@ -4,7 +4,7 @@ home=Главная
dashboard=Панель управления dashboard=Панель управления
explore=Обзор explore=Обзор
help=Помощь help=Помощь
sign_in=Войти sign_in=Вход
sign_out=Выход sign_out=Выход
sign_up=Регистрация sign_up=Регистрация
register=Регистрация register=Регистрация
@ -24,10 +24,10 @@ re_type=Введите повторно
captcha=Капча captcha=Капча
repository=Репозиторий repository=Репозиторий
organization=Группа organization=Организация
mirror=Зеркало mirror=Зеркало
new_repo=Новый репозиторий new_repo=Новый репозиторий
new_migrate=Новая Миграция new_migrate=Новая миграция
new_mirror=Новое зеркало new_mirror=Новое зеркало
new_fork=Новое ответвление репозитория new_fork=Новое ответвление репозитория
new_org=Новая организация new_org=Новая организация
@ -96,8 +96,8 @@ offline_mode=Включение офлайн режима
offline_mode_popup=Отключить CDN даже в производственном режиме, все файлы ресурсов будут раздаваться локально. offline_mode_popup=Отключить CDN даже в производственном режиме, все файлы ресурсов будут раздаваться локально.
disable_gravatar=Отключить службу Gravatar disable_gravatar=Отключить службу Gravatar
disable_gravatar_popup=Отключить Gravatar и пользовательские источники, все аватары по-умолчанию загружаются пользователями. disable_gravatar_popup=Отключить Gravatar и пользовательские источники, все аватары по-умолчанию загружаются пользователями.
federated_avatar_lookup=Enable Federated Avatars Lookup federated_avatar_lookup=Включить поиск внешних Аватаров
federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. federated_avatar_lookup_popup=Включите Поиск федеративного аватара для использования федеративной службы с открытым исходным кодом на основе libravatar.
disable_registration=Отключить самостоятельную регистрацию disable_registration=Отключить самостоятельную регистрацию
disable_registration_popup=Запретить пользователям самостоятельную регистрацию, только администратор может создавать аккаунты. disable_registration_popup=Запретить пользователям самостоятельную регистрацию, только администратор может создавать аккаунты.
enable_captcha=Включить капчу enable_captcha=Включить капчу
@ -137,6 +137,7 @@ issues.in_your_repos=В ваших репозиториях
[explore] [explore]
repos=Репозитории repos=Репозитории
users=Пользователи users=Пользователи
organizations=Organizations
search=Поиск search=Поиск
[auth] [auth]
@ -156,7 +157,6 @@ prohibit_login_desc=Вход для вашей учетной записи бы
resent_limit_prompt=Извините, вы уже запросили активацию по электронной почте недавно. Пожалуйста, подождите 3 минуты, а затем повторите попытку. resent_limit_prompt=Извините, вы уже запросили активацию по электронной почте недавно. Пожалуйста, подождите 3 минуты, а затем повторите попытку.
has_unconfirmed_mail=Здравствуйте, %s! У вас есть неподтвержденный адрес электронной почты (<b>%s</b>). Если вам не приходило письмо с подтверждением или нужно выслать новое письмо, нажмите на кнопку ниже. has_unconfirmed_mail=Здравствуйте, %s! У вас есть неподтвержденный адрес электронной почты (<b>%s</b>). Если вам не приходило письмо с подтверждением или нужно выслать новое письмо, нажмите на кнопку ниже.
resend_mail=Нажмите здесь, чтобы переотправить активационное письмо resend_mail=Нажмите здесь, чтобы переотправить активационное письмо
email_not_associate=Этот адрес электронной почты не связан ни с одной учетной записью.
send_reset_mail=Нажмите сюда, чтобы отправить письмо для сброса пароля send_reset_mail=Нажмите сюда, чтобы отправить письмо для сброса пароля
reset_password=Сброс пароля reset_password=Сброс пароля
invalid_code=Извините, ваш код подтверждения истек или не является допустимым. invalid_code=Извините, ваш код подтверждения истек или не является допустимым.
@ -190,9 +190,9 @@ AuthName=Имя авторизации
AdminEmail=Электронная почта администратора AdminEmail=Электронная почта администратора
NewBranchName=Новая ветка NewBranchName=Новая ветка
CommitSummary=Commit summary CommitSummary=Резюме коммита
CommitMessage=Зафиксировать сообщение CommitMessage=Зафиксировать сообщение
CommitChoice=Commit choice CommitChoice=Выбор коммита
TreeName=Путь к файлу TreeName=Путь к файлу
Content=Содержимое Content=Содержимое
@ -269,8 +269,8 @@ change_username_prompt=Это изменение может повлечь за
continue=Далее continue=Далее
cancel=Отмена cancel=Отмена
lookup_avatar_by_mail=Lookup Avatar by mail lookup_avatar_by_mail=Найти Аватар по адресу эл. почты
federated_avatar_lookup=Federated Avatar Lookup federated_avatar_lookup=Найти внешний Аватар
enable_custom_avatar=Включить собственный аватар enable_custom_avatar=Включить собственный аватар
choose_new_avatar=Выбрать новый аватар choose_new_avatar=Выбрать новый аватар
update_avatar=Обновить настройку аватара update_avatar=Обновить настройку аватара
@ -337,6 +337,10 @@ access_token_deletion=Удаление личного токена доступ
access_token_deletion_desc=Удаление этого персонального токена доступа приведет к удалению всех связанных прав доступа к приложению. Вы хотите продолжить? access_token_deletion_desc=Удаление этого персонального токена доступа приведет к удалению всех связанных прав доступа к приложению. Вы хотите продолжить?
delete_token_success=Персональный токен доступа успешно удален! Не забудьте изменить настройки вашего приложения. delete_token_success=Персональный токен доступа успешно удален! Не забудьте изменить настройки вашего приложения.
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=Удалить свой аккаунт delete_account=Удалить свой аккаунт
delete_prompt=Этим действием вы удалите свою учетную запись навсегда и <strong>НЕ СМОЖЕТЕ</strong> ее вернуть! delete_prompt=Этим действием вы удалите свою учетную запись навсегда и <strong>НЕ СМОЖЕТЕ</strong> ее вернуть!
confirm_delete_account=Подтвердите удаление confirm_delete_account=Подтвердите удаление
@ -366,7 +370,7 @@ auto_init=Инициализировать этот репозиторий вы
create_repo=Создать репозиторий create_repo=Создать репозиторий
default_branch=Ветка по умолчанию default_branch=Ветка по умолчанию
mirror_prune=Очистить mirror_prune=Очистить
mirror_prune_desc=Remove any remote-tracking references that no longer exist on the remote mirror_prune_desc=Удалите ссылки на удаленно отслеживаемые объекты, которых больше нет на удаленном сервере
mirror_interval=Интервал зеркалирования (час) mirror_interval=Интервал зеркалирования (час)
mirror_address=Адрес зеркала mirror_address=Адрес зеркала
mirror_address_desc=Укажите необходимые учетные данные в адрес. mirror_address_desc=Укажите необходимые учетные данные в адрес.
@ -384,7 +388,8 @@ migrate_type=Тип миграции
migrate_type_helper=Этот репозиторий будет <span class="text blue">зеркалом</span> migrate_type_helper=Этот репозиторий будет <span class="text blue">зеркалом</span>
migrate_repo=Перенос репозитория migrate_repo=Перенос репозитория
migrate.clone_address=Скопировать адрес migrate.clone_address=Скопировать адрес
migrate.clone_address_desc=Это может быть HTTP/HTTPS/GIT адрес или локальный путь на сервере. migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=У вас нет прав на импорт локальных репозиториев. migrate.permission_denied=У вас нет прав на импорт локальных репозиториев.
migrate.invalid_local_path=Недопустимый локальный путь. Возможно он не существует или является не папкой. migrate.invalid_local_path=Недопустимый локальный путь. Возможно он не существует или является не папкой.
migrate.failed=Миграция не удалась: %v migrate.failed=Миграция не удалась: %v
@ -409,7 +414,7 @@ create_new_repo_command=Создать новый репозиторий из к
push_exist_repo=Отправить существующий репозиторий из командной строки push_exist_repo=Отправить существующий репозиторий из командной строки
repo_is_empty=Этот репозиторий пуст, пожалуйста, возвращайтесь позже! repo_is_empty=Этот репозиторий пуст, пожалуйста, возвращайтесь позже!
code=Код files=Files
branch=Ветка branch=Ветка
tree=Дерево tree=Дерево
filter_branch_and_tag=Фильтр по ветке или тегу filter_branch_and_tag=Фильтр по ветке или тегу
@ -426,20 +431,21 @@ file_history=История
file_view_raw=Посмотреть исходник file_view_raw=Посмотреть исходник
file_permalink=Постоянная ссылка file_permalink=Постоянная ссылка
file_too_large=Этот файл слишком большой, поэтому он не может быть отображен file_too_large=Этот файл слишком большой, поэтому он не может быть отображен
video_not_supported_in_browser=Your browser doesn't support HTML5 video tag.
editor.new_file=Новый файл editor.new_file=Новый файл
editor.upload_file=Загрузить файл editor.upload_file=Загрузить файл
editor.edit_file=Редактировать файл editor.edit_file=Редактировать файл
editor.preview_changes=Просмотр изменений editor.preview_changes=Просмотр изменений
editor.cannot_edit_non_text_files=Cannot edit non-text files editor.cannot_edit_non_text_files=Возможно редактировать только текстовые файлы
editor.edit_this_file=Отредактируйте этот файл editor.edit_this_file=Отредактируйте этот файл
editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file editor.must_be_on_a_branch=Чтобы сделать или предложить изменения вы должны выбрать ветку
editor.fork_before_edit=Создайте ветку репозитория перед редактированием файла editor.fork_before_edit=Создайте ветку репозитория перед редактированием файла
editor.delete_this_file=Удалить файл editor.delete_this_file=Удалить файл
editor.must_have_write_access=You must have write access to make or propose changes to this file editor.must_have_write_access=Вам необходимо иметь доступ на запись, чтобы вносить или предлагать правки этого файла
editor.file_delete_success=File '%s' has been deleted successfully! editor.file_delete_success=Файл «%s» был успешно удален!
editor.name_your_file=Name your file... editor.name_your_file=Назовите свой файл...
editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. editor.filename_help=Чтобы добавить каталог, просто наберите название и нажмите /. Чтобы удалить каталог, перейдите к началу поля и нажмите клавишу backspace.
editor.or=или editor.or=или
editor.cancel_lower=отмена editor.cancel_lower=отмена
editor.commit_changes=Фиксация изменений editor.commit_changes=Фиксация изменений
@ -447,22 +453,23 @@ editor.add_tmpl=Добавить '%s/<filename>'
editor.add=Добавить '%s' editor.add=Добавить '%s'
editor.update=Обновить '%s' editor.update=Обновить '%s'
editor.delete=Удалить '%s' editor.delete=Удалить '%s'
editor.commit_message_desc=Add an optional extended description... editor.commit_message_desc=Добавьте необязательное расширенное описание...
editor.commit_directly_to_this_branch=Commit directly to the <strong class="branch-name">%s</strong> branch. editor.commit_directly_to_this_branch=Сделайте коммит прямо в ветку <strong class="branch-name">%s</strong>.
editor.create_new_branch=Create a <strong>new branch</strong> for this commit and start a pull request. editor.create_new_branch=Создайте <strong>новую ветвь</strong> для этого коммита, и сделайте пул запрос.
editor.new_branch_name_desc=Новое название ветки... editor.new_branch_name_desc=Новое название ветки...
editor.cancel=Отмена editor.cancel=Отмена
editor.filename_cannot_be_empty=Имя файла не может быть пустым. editor.filename_cannot_be_empty=Имя файла не может быть пустым.
editor.branch_already_exists=Branch '%s' already exists in this repository. editor.branch_already_exists=Ветка «%s» уже существует в этом репозитории.
editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. editor.directory_is_a_file=Запись «%s» в пути на верх является файлом, а не каталогом этого репозитория.
editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor.
editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. editor.filename_is_a_directory=Файл «%s» является каталогом в этом репозитории.
editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes. editor.file_editing_no_longer_exists=Редактируемый вами файл «%s» больше не существует в репозитории.
editor.file_already_exists=A file with name '%s' already exists in this repository. editor.file_changed_while_editing=Содержимое файла изменилось со времени начала редактирования. <a target="_blank" href="%s"> нажмите здесь,</a> чтобы увидеть, что было изменено, или <strong>нажмите кнопку commit снова</strong>, чтобы перезаписать эти изменения.
editor.file_already_exists=Файл с именем «%s» уже существует в этом репозитории.
editor.no_changes_to_show=Нет изменений. editor.no_changes_to_show=Нет изменений.
editor.fail_to_update_file=Failed to update/create file '%s' with error: %v editor.fail_to_update_file=Не удалось обновить/создать файл «%s» из-за ошибки: %v
editor.add_subdir=Добавьте подкаталог... editor.add_subdir=Добавьте подкаталог...
editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v editor.unable_to_upload_files=Не удалось загрузить файлы в «%s» из-за ошибки: %v
editor.upload_files_to_dir=Загрузить файлы '%s' editor.upload_files_to_dir=Загрузить файлы '%s'
commits.commits=Коммиты commits.commits=Коммиты
@ -490,11 +497,11 @@ issues.create=Добавить задачу
issues.new_label=Новая метка issues.new_label=Новая метка
issues.new_label_placeholder=Имя метки... issues.new_label_placeholder=Имя метки...
issues.create_label=Добавить метку issues.create_label=Добавить метку
issues.label_templates.title=Load a predefined set of labels issues.label_templates.title=Загрузить набор предопределённых меток
issues.label_templates.info=There aren’t any labels yet. You can click on the "New Label" button above to create one or use a predefined set below. issues.label_templates.info=Меток пока нет. Вы можете нажать на кнопку «Создать метку», чтобы создать новую или использовать одну из готового набора ниже.
issues.label_templates.helper=Выберите метку issues.label_templates.helper=Выберите метку
issues.label_templates.use=Использовать ярлык issues.label_templates.use=Использовать ярлык
issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v issues.label_templates.fail_to_load_file=Не удалось загрузить файл шаблона метки «%s»: %v
issues.open_tab=%d открыто(ы) issues.open_tab=%d открыто(ы)
issues.close_tab=%d закрыто(ы) issues.close_tab=%d закрыто(ы)
issues.filter_label=Метка issues.filter_label=Метка
@ -522,7 +529,7 @@ issues.next=Следующая страница
issues.open_title=Открыто issues.open_title=Открыто
issues.closed_title=Закрыто issues.closed_title=Закрыто
issues.num_comments=комментариев: %d issues.num_comments=комментариев: %d
issues.commented_at=`commented <a href="#%s">%s</a>` issues.commented_at=«прокомментировал <a href="#%s"> %s</a>»
issues.delete_comment_confirm=Вы уверены, что хотите удалить этот комментарий? issues.delete_comment_confirm=Вы уверены, что хотите удалить этот комментарий?
issues.no_content=Пока нет содержимого. issues.no_content=Пока нет содержимого.
issues.close_issue=Закрыть issues.close_issue=Закрыть
@ -536,7 +543,7 @@ issues.commit_ref_at=`упомянул эту задачу в коммите <a
issues.poster=Автор issues.poster=Автор
issues.collaborator=Соавтор issues.collaborator=Соавтор
issues.owner=Владелец issues.owner=Владелец
issues.sign_in_require_desc=<a href="%s">Sign in</a> to join this conversation. issues.sign_in_require_desc=<a href="%s">Войдите</a>, чтобы присоединиться к обсуждению.
issues.edit=Изменить issues.edit=Изменить
issues.cancel=Отмена issues.cancel=Отмена
issues.save=Сохранить issues.save=Сохранить
@ -551,8 +558,8 @@ issues.label_deletion=Удаление метки
issues.label_deletion_desc=Удаление ярлыка затронет все связанные задачи. Продолжить? issues.label_deletion_desc=Удаление ярлыка затронет все связанные задачи. Продолжить?
issues.label_deletion_success=Метка была удалена успешно! issues.label_deletion_success=Метка была удалена успешно!
issues.num_participants=%d участников issues.num_participants=%d участников
issues.attachment.open_tab=`Click to see "%s" in a new tab` issues.attachment.open_tab=`Нажмите, чтобы увидеть "%s" в новой вкладке`
issues.attachment.download=`Click to download "%s"` issues.attachment.download=`Нажмите, чтобы скачать "%s"`
pulls.new=Новый запрос на слияние pulls.new=Новый запрос на слияние
pulls.compare_changes=Сравнить изменения pulls.compare_changes=Сравнить изменения
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=Этот запрос на слияние не мо
pulls.cannot_auto_merge_helper=Пожалуйста, совершите слияние вручную для урегулирования конфликтов. pulls.cannot_auto_merge_helper=Пожалуйста, совершите слияние вручную для урегулирования конфликтов.
pulls.merge_pull_request=Слить пулл-реквест pulls.merge_pull_request=Слить пулл-реквест
pulls.open_unmerged_pull_exists=`Вы не можете снова открыть, поскольку уже существует запрос на слияние (#%d) из того же репозитория с той же информацией о слиянии и ожидающий слияния. ` pulls.open_unmerged_pull_exists=`Вы не можете снова открыть, поскольку уже существует запрос на слияние (#%d) из того же репозитория с той же информацией о слиянии и ожидающий слияния. `
pulls.delete_branch=Delete Branch
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
milestones.new=Новая контрольная точка milestones.new=Новая контрольная точка
milestones.open_tab=%d открыты milestones.open_tab=%d открыты
@ -634,7 +643,7 @@ settings.githooks=Git хуки
settings.basic_settings=Основные параметры settings.basic_settings=Основные параметры
settings.mirror_settings=Настройки Зеркала settings.mirror_settings=Настройки Зеркала
settings.sync_mirror=Синхронизировать settings.sync_mirror=Синхронизировать
settings.mirror_sync_in_progress=Mirror syncing is in progress, please refresh page in about a minute. settings.mirror_sync_in_progress=Выполняется синхронизация Зеркала, пожалуйста, обновите эту страницу через минуту.
settings.site=Официальный сайт settings.site=Официальный сайт
settings.update_settings=Обновить настройки settings.update_settings=Обновить настройки
settings.change_reponame_prompt=Это изменение повлияет на отношения ссылок к этому репозиторию. settings.change_reponame_prompt=Это изменение повлияет на отношения ссылок к этому репозиторию.
@ -675,7 +684,7 @@ settings.delete_notices_1=- Эта операция <strong>НЕ МОЖЕТ</str
settings.delete_notices_2=- Эта операция навсегда удалит всё из этого репозитория, включая данные Git, связанные с ним задачи, комментарии и права доступа для сотрудников. settings.delete_notices_2=- Эта операция навсегда удалит всё из этого репозитория, включая данные Git, связанные с ним задачи, комментарии и права доступа для сотрудников.
settings.delete_notices_fork_1=- Все отвлетвления станут независимыми после удаления. settings.delete_notices_fork_1=- Все отвлетвления станут независимыми после удаления.
settings.deletion_success=Репозиторий был успешно удалён! settings.deletion_success=Репозиторий был успешно удалён!
settings.update_settings_success=Настройка репозитория обновлена успешно. settings.update_settings_success=Настройки репозитория обновлены успешно.
settings.transfer_owner=Новый владелец settings.transfer_owner=Новый владелец
settings.make_transfer=Выполнить передачу settings.make_transfer=Выполнить передачу
settings.transfer_succeed=Владение репозиторием было успешно передано. settings.transfer_succeed=Владение репозиторием было успешно передано.
@ -721,7 +730,7 @@ settings.event_choose=Позвольте мне выбрать то, что ну
settings.event_create=Создать settings.event_create=Создать
settings.event_create_desc=Ветка или тэг созданы settings.event_create_desc=Ветка или тэг созданы
settings.event_pull_request=Запросы на слияние settings.event_pull_request=Запросы на слияние
settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. settings.event_pull_request_desc=Запрос слияния открыт, закрыт, переоткрыт, изменён, назначен, снят, метка обновлена, метка убрана, или синхронизирован.
settings.event_push=Push settings.event_push=Push
settings.event_push_desc=Push в репозиторий settings.event_push_desc=Push в репозиторий
settings.active=Активен settings.active=Активен
@ -1028,6 +1037,7 @@ auths.delete_auth_title=Удаление канала аутентификаци
auths.delete_auth_desc=Этот канал аутентификации будет удален. Вы уверены что хотите продолжить? auths.delete_auth_desc=Этот канал аутентификации будет удален. Вы уверены что хотите продолжить?
auths.still_in_used=Эта проверка подлинности до сих пор используется некоторыми пользователями, удалите или преобразуйте этих пользователей в другой тип входа в систему. auths.still_in_used=Эта проверка подлинности до сих пор используется некоторыми пользователями, удалите или преобразуйте этих пользователей в другой тип входа в систему.
auths.deletion_success=Канал аутентификации успешно удален! auths.deletion_success=Канал аутентификации успешно удален!
auths.login_source_exist=Login source '%s' already exists.
config.server_config=Конфигурация сервера config.server_config=Конфигурация сервера
config.app_name=Имя приложения config.app_name=Имя приложения
@ -1113,13 +1123,13 @@ config.cookie_life_time=Время жизни файла cookie
config.picture_config=Настройка изображения config.picture_config=Настройка изображения
config.picture_service=Сервис изображений config.picture_service=Сервис изображений
config.disable_gravatar=Отключить Gravatar config.disable_gravatar=Отключить Gravatar
config.enable_federated_avatar=Enable Federated Avatars config.enable_federated_avatar=Включить внешние Аватары
config.git_config=Конфигурация GIT config.git_config=Конфигурация GIT
config.git_disable_diff_highlight=Disable Diff Syntax Highlight config.git_disable_diff_highlight=Отключить подсветку синтаксиса Diff
config.git_max_diff_lines=Max Diff Lines (for a single file) config.git_max_diff_lines=Максимальное количество строк Diff (на файл)
config.git_max_diff_line_characters=Max Diff Characters (for a single line) config.git_max_diff_line_characters=Максимальное количество символов Diff (в строке)
config.git_max_diff_files=Max Diff Files (to be shown) config.git_max_diff_files=Максимальное количество Diff-файлов (при показе)
config.git_gc_args=Аргументы GC config.git_gc_args=Аргументы GC
config.git_migrate_timeout=Тайм-аут миграции config.git_migrate_timeout=Тайм-аут миграции
config.git_mirror_timeout=Время Ожидания Обновления Зеркала config.git_mirror_timeout=Время Ожидания Обновления Зеркала

16
conf/locale/locale_sr-SP.ini

@ -137,6 +137,7 @@ issues.in_your_repos=У вашим спремиштима
[explore] [explore]
repos=Спремишта repos=Спремишта
users=Корисници users=Корисници
organizations=Organizations
search=Претрага search=Претрага
[auth] [auth]
@ -156,7 +157,6 @@ prohibit_login_desc=Улаз у ваш налог је забрањено, мо
resent_limit_prompt=Извините, већ сте недавно тражили активацију путем е-поште. Молимо вас, сачекајте 3 минута и покушајте поново. resent_limit_prompt=Извините, већ сте недавно тражили активацију путем е-поште. Молимо вас, сачекајте 3 минута и покушајте поново.
has_unconfirmed_mail=Здраво, %s! Имате непотврђену адресу е-поште (<b>%s</b>). Ако вам није стигло писмо са потврдом или морате да пошаљете нову поруку, притисните на пратеће дугме. has_unconfirmed_mail=Здраво, %s! Имате непотврђену адресу е-поште (<b>%s</b>). Ако вам није стигло писмо са потврдом или морате да пошаљете нову поруку, притисните на пратеће дугме.
resend_mail=Кликните овде да поново пошаљете писмо resend_mail=Кликните овде да поново пошаљете писмо
email_not_associate=Ова адреса е-поште није повезана ни са једним налогом.
send_reset_mail=Кликните овде да (поново) пошаљете поруку како би променили лозинку send_reset_mail=Кликните овде да (поново) пошаљете поруку како би променили лозинку
reset_password=Ресет лозинке reset_password=Ресет лозинке
invalid_code=Извините, ваш код за потврду је истекао или није валидан. invalid_code=Извините, ваш код за потврду је истекао или није валидан.
@ -337,6 +337,10 @@ access_token_deletion=Уклоњење токена личног приступ
access_token_deletion_desc=Уклоњење овог токена ће онемогућити сав приступ. Да ли желите да наставите? access_token_deletion_desc=Уклоњење овог токена ће онемогућити сав приступ. Да ли желите да наставите?
delete_token_success=Лични токен је успешно избришен! Не заборавите да ажурирате апликацију. delete_token_success=Лични токен је успешно избришен! Не заборавите да ажурирате апликацију.
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=Уклоните ваш налог delete_account=Уклоните ваш налог
delete_prompt=Операција ће трајно избрисати ваш налог, што се <strong>НЕ може</strong> поввратити! delete_prompt=Операција ће трајно избрисати ваш налог, што се <strong>НЕ може</strong> поввратити!
confirm_delete_account=Потврдите брисање confirm_delete_account=Потврдите брисање
@ -384,7 +388,8 @@ migrate_type=Тип миграције
migrate_type_helper=Ово спремиште ће бити <span class="text blue">огледало</span> migrate_type_helper=Ово спремиште ће бити <span class="text blue">огледало</span>
migrate_repo=Мигрирајте спремиште migrate_repo=Мигрирајте спремиште
migrate.clone_address=Адреса за клонирање migrate.clone_address=Адреса за клонирање
migrate.clone_address_desc=Ово може бити URL адреса врсте HTTP/HTTPS/GIT или пут на локалном серверу. migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=Немате права на увезете локално спремиште. migrate.permission_denied=Немате права на увезете локално спремиште.
migrate.invalid_local_path=Невашећи локални пут. Можда не постоји или није директоријум. migrate.invalid_local_path=Невашећи локални пут. Можда не постоји или није директоријум.
migrate.failed=Миграција није успела: %v migrate.failed=Миграција није успела: %v
@ -409,7 +414,7 @@ create_new_repo_command=Направите ново спремиште са ко
push_exist_repo=Push постојећe спремиште са командне линије push_exist_repo=Push постојећe спремиште са командне линије
repo_is_empty=Овo спремиште je празнo, молимо вас, вратите се касније! repo_is_empty=Овo спремиште je празнo, молимо вас, вратите се касније!
code=Код files=Files
branch=Грана branch=Грана
tree=Дрво tree=Дрво
filter_branch_and_tag=Профилтрирај по грани или ознаци filter_branch_and_tag=Профилтрирај по грани или ознаци
@ -426,6 +431,7 @@ file_history=Историја
file_view_raw=Прегледај саму датотеку file_view_raw=Прегледај саму датотеку
file_permalink=Пермалинк file_permalink=Пермалинк
file_too_large=Ова датотека је превише веика да би се приказала file_too_large=Ова датотека је превише веика да би се приказала
video_not_supported_in_browser=Your browser doesn't support HTML5 video tag.
editor.new_file=Нова датотека editor.new_file=Нова датотека
editor.upload_file=Отпреми датотеку editor.upload_file=Отпреми датотеку
@ -455,6 +461,7 @@ editor.cancel=Откажи
editor.filename_cannot_be_empty=Име датотеке неможе бити празно. editor.filename_cannot_be_empty=Име датотеке неможе бити празно.
editor.branch_already_exists=Грана '%s' већ постоји за ово спремиште. editor.branch_already_exists=Грана '%s' већ постоји за ово спремиште.
editor.directory_is_a_file='%s' је већ постојећа датотека а не директоријум у спремишту. editor.directory_is_a_file='%s' је већ постојећа датотека а не директоријум у спремишту.
editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor.
editor.filename_is_a_directory='%s' је постојећи директоријум у спремишту. editor.filename_is_a_directory='%s' је постојећи директоријум у спремишту.
editor.file_editing_no_longer_exists=Датотека '%s' више не постоји у спремишту. editor.file_editing_no_longer_exists=Датотека '%s' више не постоји у спремишту.
editor.file_changed_while_editing=Садржај датотеке је промењен од почетка уређивања. <a target="_blank" href="%s">Кликните овде</a> да видите шта је промењено или <strong>опет поднесите комит</strong> да пребришете промене. editor.file_changed_while_editing=Садржај датотеке је промењен од почетка уређивања. <a target="_blank" href="%s">Кликните овде</a> да видите шта је промењено или <strong>опет поднесите комит</strong> да пребришете промене.
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=Овај захтев за спајање не мо
pulls.cannot_auto_merge_helper=Молимо вас, обавите спајање ручно да би сте разрешили сукобе. pulls.cannot_auto_merge_helper=Молимо вас, обавите спајање ручно да би сте разрешили сукобе.
pulls.merge_pull_request=Обави спајање pulls.merge_pull_request=Обави спајање
pulls.open_unmerged_pull_exists=`Неможете поново отворити јер већ постоји захтев за спајање (#%d) из истог спремишта са истим информацијама о спајању и чека спајање.` pulls.open_unmerged_pull_exists=`Неможете поново отворити јер већ постоји захтев за спајање (#%d) из истог спремишта са истим информацијама о спајању и чека спајање.`
pulls.delete_branch=Delete Branch
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
milestones.new=Нова фаза milestones.new=Нова фаза
milestones.open_tab=%d отворено milestones.open_tab=%d отворено
@ -1028,6 +1037,7 @@ auths.delete_auth_title=Брисање канала аутентикације
auths.delete_auth_desc=Овај канал аутентикације ће бити избрисан. Да ли желите да наставите? auths.delete_auth_desc=Овај канал аутентикације ће бити избрисан. Да ли желите да наставите?
auths.still_in_used=Овај канал аутентикације још увек се користи од стране неких корисника, уклоните или пребаци ове кориснике у друг врсту аутентикације. auths.still_in_used=Овај канал аутентикације још увек се користи од стране неких корисника, уклоните или пребаци ове кориснике у друг врсту аутентикације.
auths.deletion_success=Канал аутентикације успешно избрисан! auths.deletion_success=Канал аутентикације успешно избрисан!
auths.login_source_exist=Login source '%s' already exists.
config.server_config=Конфигурација сервера config.server_config=Конфигурација сервера
config.app_name=Име апликације config.app_name=Име апликације

1210
conf/locale/locale_sv-SE.ini

File diff suppressed because it is too large Load Diff

28
conf/locale/locale_tr-TR.ini

@ -137,6 +137,7 @@ issues.in_your_repos=Depolarınızda
[explore] [explore]
repos=Depolar repos=Depolar
users=Kullanıcılar users=Kullanıcılar
organizations=Organizations
search=Ara search=Ara
[auth] [auth]
@ -156,7 +157,6 @@ prohibit_login_desc=Hesabınızla oturum açmanız yasaklanmış, lütfen site y
resent_limit_prompt=Üzgünüz, zaten bir doğrulama e-postası talep ettiniz. Lütfen 3 dakika bekleyip tekrar deneyin. resent_limit_prompt=Üzgünüz, zaten bir doğrulama e-postası talep ettiniz. Lütfen 3 dakika bekleyip tekrar deneyin.
has_unconfirmed_mail=Merhaba %s, doğrulanmamış bir e-posta adresin var (<b>%s</b>). Bir doğrulama e-postası almadıysanız ya da yenisine ihtiyacınız varsa lütfen aşağıdaki düğmeye tıklayın. has_unconfirmed_mail=Merhaba %s, doğrulanmamış bir e-posta adresin var (<b>%s</b>). Bir doğrulama e-postası almadıysanız ya da yenisine ihtiyacınız varsa lütfen aşağıdaki düğmeye tıklayın.
resend_mail=Doğrulama e-postasını tekrar almak için buraya tıklayın resend_mail=Doğrulama e-postasını tekrar almak için buraya tıklayın
email_not_associate=Bu e-posta adresi hiçbir hesaba bağlı değil.
send_reset_mail=Parola sıfırlama e-postasını (yeniden) göndermek için buraya tıklayın send_reset_mail=Parola sıfırlama e-postasını (yeniden) göndermek için buraya tıklayın
reset_password=Parolanızı Sıfırlayın reset_password=Parolanızı Sıfırlayın
invalid_code=Üzgünüz, doğrulama kodunuz geçersiz veya süresi dolmuş. invalid_code=Üzgünüz, doğrulama kodunuz geçersiz veya süresi dolmuş.
@ -193,7 +193,7 @@ NewBranchName=New branch name
CommitSummary=Commit summary CommitSummary=Commit summary
CommitMessage=Commit message CommitMessage=Commit message
CommitChoice=Commit choice CommitChoice=Commit choice
TreeName=File path TreeName=Dosya yolu
Content=Content Content=Content
require_error=` boş olamaz.` require_error=` boş olamaz.`
@ -337,6 +337,10 @@ access_token_deletion=Kişisel Erişim Anahtarını Silme
access_token_deletion_desc=Bu kişisel erişim anahtarını silerseniz uygulamanıza ilişkin tüm erişimler de kaldırılacaktır. Devam etmek istiyor musunuz? access_token_deletion_desc=Bu kişisel erişim anahtarını silerseniz uygulamanıza ilişkin tüm erişimler de kaldırılacaktır. Devam etmek istiyor musunuz?
delete_token_success=Kişisel erişim anahtarı başarıyla kaldırıldı! Uygulamanızı güncellemeyi de unutmayın! delete_token_success=Kişisel erişim anahtarı başarıyla kaldırıldı! Uygulamanızı güncellemeyi de unutmayın!
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=Hesabınızı Silin delete_account=Hesabınızı Silin
delete_prompt=Bu işlem hesabınızı kalıcı olarak silecektir ve <strong>GERİ ALINAMAZ</strong>! delete_prompt=Bu işlem hesabınızı kalıcı olarak silecektir ve <strong>GERİ ALINAMAZ</strong>!
confirm_delete_account=Silmeyi Onayla confirm_delete_account=Silmeyi Onayla
@ -384,7 +388,8 @@ migrate_type=Göç Türü
migrate_type_helper=Bu depo bir <span class="text blue">yansı</span> olacaktır migrate_type_helper=Bu depo bir <span class="text blue">yansı</span> olacaktır
migrate_repo=Depoyu Göç Ettir migrate_repo=Depoyu Göç Ettir
migrate.clone_address=Klon Adresi migrate.clone_address=Klon Adresi
migrate.clone_address_desc=Bu bağlantı HTTP/HTTPS/GIT veya yerel bir sunucu yolu olabilir. migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=Yerel depoları içeri aktarma izniniz yok. migrate.permission_denied=Yerel depoları içeri aktarma izniniz yok.
migrate.invalid_local_path=Geçersiz yerel dizin! Böyle bir yol yok ya da bir dizin değil. migrate.invalid_local_path=Geçersiz yerel dizin! Böyle bir yol yok ya da bir dizin değil.
migrate.failed=Göç başarısız: %v migrate.failed=Göç başarısız: %v
@ -409,7 +414,7 @@ create_new_repo_command=Komut satırında yeni bir depo oluştur
push_exist_repo=Var olan bir depoyu komut satırında gönder push_exist_repo=Var olan bir depoyu komut satırında gönder
repo_is_empty=Bu depo boş. Lütfen daha sonra tekrar gelin! repo_is_empty=Bu depo boş. Lütfen daha sonra tekrar gelin!
code=Kod files=Files
branch=Dal branch=Dal
tree=Ağaç tree=Ağaç
filter_branch_and_tag=Dal veya biçim imini filtrele filter_branch_and_tag=Dal veya biçim imini filtrele
@ -426,12 +431,13 @@ file_history=Geçmiş
file_view_raw=Ham Görünüm file_view_raw=Ham Görünüm
file_permalink=Kalıcı Bağlantı file_permalink=Kalıcı Bağlantı
file_too_large=Bu dosya sergilenmek için çok büyük file_too_large=Bu dosya sergilenmek için çok büyük
video_not_supported_in_browser=Your browser doesn't support HTML5 video tag.
editor.new_file=New file editor.new_file=New file
editor.upload_file=Upload file editor.upload_file=Upload file
editor.edit_file=Edit file editor.edit_file=Dosya düzenle
editor.preview_changes=Preview Changes editor.preview_changes=Preview Changes
editor.cannot_edit_non_text_files=Cannot edit non-text files editor.cannot_edit_non_text_files=Metin dışı dosyalar düzenlenemez
editor.edit_this_file=Edit this file editor.edit_this_file=Edit this file
editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file
editor.fork_before_edit=You must fork this repository before editing the file editor.fork_before_edit=You must fork this repository before editing the file
@ -441,7 +447,7 @@ editor.file_delete_success=File '%s' has been deleted successfully!
editor.name_your_file=Name your file... editor.name_your_file=Name your file...
editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace.
editor.or=or editor.or=or
editor.cancel_lower=cancel editor.cancel_lower=iptal
editor.commit_changes=Commit Changes editor.commit_changes=Commit Changes
editor.add_tmpl=Add '%s/<filename>' editor.add_tmpl=Add '%s/<filename>'
editor.add=Add '%s' editor.add=Add '%s'
@ -451,10 +457,11 @@ editor.commit_message_desc=Add an optional extended description...
editor.commit_directly_to_this_branch=Commit directly to the <strong class="branch-name">%s</strong> branch. editor.commit_directly_to_this_branch=Commit directly to the <strong class="branch-name">%s</strong> branch.
editor.create_new_branch=Create a <strong>new branch</strong> for this commit and start a pull request. editor.create_new_branch=Create a <strong>new branch</strong> for this commit and start a pull request.
editor.new_branch_name_desc=New branch name... editor.new_branch_name_desc=New branch name...
editor.cancel=Cancel editor.cancel=İptal
editor.filename_cannot_be_empty=Filename cannot be empty. editor.filename_cannot_be_empty=Filename cannot be empty.
editor.branch_already_exists=Branch '%s' already exists in this repository. editor.branch_already_exists=Branch '%s' already exists in this repository.
editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository.
editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor.
editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository.
editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository.
editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes. editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes.
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=Çakışmalardan dolayı bu değişiklik isteği ot
pulls.cannot_auto_merge_helper=Çakışmaları çözmek için lütfen elle birleştirin. pulls.cannot_auto_merge_helper=Çakışmaları çözmek için lütfen elle birleştirin.
pulls.merge_pull_request=Değişiklik İsteğini Birleştir pulls.merge_pull_request=Değişiklik İsteğini Birleştir
pulls.open_unmerged_pull_exists=`Yeniden açma işlemini gerçekleştiremezsiniz. Çünkü zaten aynı depodan, aynı birleştirme bilgisiyle açık olan bir değişiklik isteği var (#%d) ve birleştirme bekliyor.` pulls.open_unmerged_pull_exists=`Yeniden açma işlemini gerçekleştiremezsiniz. Çünkü zaten aynı depodan, aynı birleştirme bilgisiyle açık olan bir değişiklik isteği var (#%d) ve birleştirme bekliyor.`
pulls.delete_branch=Delete Branch
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
milestones.new=Yeni Kilometre Taşı milestones.new=Yeni Kilometre Taşı
milestones.open_tab=%d Açık milestones.open_tab=%d Açık
@ -639,7 +648,7 @@ settings.site=Resmi Web Sitesi
settings.update_settings=Ayarları Güncelle settings.update_settings=Ayarları Güncelle
settings.change_reponame_prompt=Bu değişiklik, bağlantıların depoyla olan ilişkisini etkileyecektir. settings.change_reponame_prompt=Bu değişiklik, bağlantıların depoyla olan ilişkisini etkileyecektir.
settings.advanced_settings=Gelişmiş Ayarlar settings.advanced_settings=Gelişmiş Ayarlar
settings.wiki_desc=Enable wiki system settings.wiki_desc=Viki sıstemini etkinleştir
settings.use_internal_wiki=Use builtin wiki settings.use_internal_wiki=Use builtin wiki
settings.use_external_wiki=Harici Wiki kullan settings.use_external_wiki=Harici Wiki kullan
settings.external_wiki_url=Harici Wiki bağlantısı settings.external_wiki_url=Harici Wiki bağlantısı
@ -1028,6 +1037,7 @@ auths.delete_auth_title=Yetkilendirme Silme
auths.delete_auth_desc=Bu yetkilendirme silinecek. Devam etmek istiyor musunuz? auths.delete_auth_desc=Bu yetkilendirme silinecek. Devam etmek istiyor musunuz?
auths.still_in_used=Bu yetkilendirme hala bazı kullanıcılar tarafından kullanılıyor. Lütfen öncelikle bunları silin ya da başka oturum açma türlerine çevirin. auths.still_in_used=Bu yetkilendirme hala bazı kullanıcılar tarafından kullanılıyor. Lütfen öncelikle bunları silin ya da başka oturum açma türlerine çevirin.
auths.deletion_success=Yetkilendirme başarıyla silindi! auths.deletion_success=Yetkilendirme başarıyla silindi!
auths.login_source_exist=Login source '%s' already exists.
config.server_config=Sunucu Yapılandırması config.server_config=Sunucu Yapılandırması
config.app_name=Uygulama Adı config.app_name=Uygulama Adı

16
conf/locale/locale_zh-CN.ini

@ -137,6 +137,7 @@ issues.in_your_repos=属于该用户仓库的
[explore] [explore]
repos=仓库 repos=仓库
users=用户 users=用户
organizations=组织
search=搜索 search=搜索
[auth] [auth]
@ -156,7 +157,6 @@ prohibit_login_desc=您的帐户被禁止登录,请联系网站管理员。
resent_limit_prompt=对不起,您请求发送激活邮件过于频繁,请等待 3 分钟后再试! resent_limit_prompt=对不起,您请求发送激活邮件过于频繁,请等待 3 分钟后再试!
has_unconfirmed_mail=%s 您好,系统检测到您有一封发送至 <b>%s</b> 但未被确认的邮件。如果您未收到激活邮件,或需要重新发送,请单击下方的按钮。 has_unconfirmed_mail=%s 您好,系统检测到您有一封发送至 <b>%s</b> 但未被确认的邮件。如果您未收到激活邮件,或需要重新发送,请单击下方的按钮。
resend_mail=单击此处重新发送确认邮件 resend_mail=单击此处重新发送确认邮件
email_not_associate=您输入的邮箱地址未被关联到任何帐号!
send_reset_mail=单击此处(重新)发送您的密码重置邮件 send_reset_mail=单击此处(重新)发送您的密码重置邮件
reset_password=重置密码 reset_password=重置密码
invalid_code=对不起,您的确认代码已过期或已失效。 invalid_code=对不起,您的确认代码已过期或已失效。
@ -337,6 +337,10 @@ access_token_deletion=删除个人操作令牌操作
access_token_deletion_desc=删除该个人操作令牌将删除所有相关的应用程序的访问权限。是否继续? access_token_deletion_desc=删除该个人操作令牌将删除所有相关的应用程序的访问权限。是否继续?
delete_token_success=个人操作令牌删除成功!请更新与该令牌有关的所有应用。 delete_token_success=个人操作令牌删除成功!请更新与该令牌有关的所有应用。
orgs.none=您现在还不是任何组织的成员。
orgs.leave_title=离开组织
orgs.leave_desc=离开组织后,组织相关的所有仓库和团队权限将被收回。是否继续?
delete_account=删除当前帐户 delete_account=删除当前帐户
delete_prompt=删除操作会永久清除您的帐户信息,并且 <strong>不可恢复</strong>! delete_prompt=删除操作会永久清除您的帐户信息,并且 <strong>不可恢复</strong>!
confirm_delete_account=确认删除帐户 confirm_delete_account=确认删除帐户
@ -384,7 +388,8 @@ migrate_type=迁移类型
migrate_type_helper=该仓库将是一个 <span class="text blue">镜像</span> migrate_type_helper=该仓库将是一个 <span class="text blue">镜像</span>
migrate_repo=迁移仓库 migrate_repo=迁移仓库
migrate.clone_address=克隆地址 migrate.clone_address=克隆地址
migrate.clone_address_desc=该地址可以是 HTTP/HTTPS/GIT URL 或本地服务器路径。 migrate.clone_address_desc=该地址可以是 HTTP/HTTPS/GIT 类型的 URL。
migrate.clone_address_desc_import_local=您被允许使用服务器本地路径作为仓库的远程地址进行迁移。
migrate.permission_denied=您没有获得导入本地仓库的权限。 migrate.permission_denied=您没有获得导入本地仓库的权限。
migrate.invalid_local_path=无效的本地路径,不存在或不是一个目录! migrate.invalid_local_path=无效的本地路径,不存在或不是一个目录!
migrate.failed=迁移失败:%v migrate.failed=迁移失败:%v
@ -409,7 +414,7 @@ create_new_repo_command=从命令行创建一个新的仓库
push_exist_repo=从命令行推送已经创建的仓库 push_exist_repo=从命令行推送已经创建的仓库
repo_is_empty=该仓库不包含任何内容,请稍后再进行访问! repo_is_empty=该仓库不包含任何内容,请稍后再进行访问!
code=代码 files=文件
branch=分支 branch=分支
tree=目录树 tree=目录树
filter_branch_and_tag=过滤分支或标签 filter_branch_and_tag=过滤分支或标签
@ -426,6 +431,7 @@ file_history=文件历史
file_view_raw=查看原始文件 file_view_raw=查看原始文件
file_permalink=永久链接 file_permalink=永久链接
file_too_large=文件过大导致无法显示 file_too_large=文件过大导致无法显示
video_not_supported_in_browser=您的浏览器不支持使用 HTML5 播放视频。
editor.new_file=新的文件 editor.new_file=新的文件
editor.upload_file=上传文件 editor.upload_file=上传文件
@ -455,6 +461,7 @@ editor.cancel=取消
editor.filename_cannot_be_empty=文件名不能为空。 editor.filename_cannot_be_empty=文件名不能为空。
editor.branch_already_exists=此仓库已存在名为 '%s' 的分支。 editor.branch_already_exists=此仓库已存在名为 '%s' 的分支。
editor.directory_is_a_file=路径 '%s' 的父路径中包含此仓库已存在的文件名。 editor.directory_is_a_file=路径 '%s' 的父路径中包含此仓库已存在的文件名。
editor.file_is_a_symlink=文件 '%s' 为一个符号链接,无法通过 Web 编辑器编辑内容。
editor.filename_is_a_directory=文件名 '%s' 是此仓库中已存在的目录名。 editor.filename_is_a_directory=文件名 '%s' 是此仓库中已存在的目录名。
editor.file_editing_no_longer_exists=您编辑的文件 '%s' 已经不存在于此仓库中。 editor.file_editing_no_longer_exists=您编辑的文件 '%s' 已经不存在于此仓库中。
editor.file_changed_while_editing=文件内容在您进行编辑时已经发生变动。<a target="_blank" href="%s">单击此处</a> 查看变动的具体内容,或者 <strong>再次提交</strong> 覆盖已发生的变动。 editor.file_changed_while_editing=文件内容在您进行编辑时已经发生变动。<a target="_blank" href="%s">单击此处</a> 查看变动的具体内容,或者 <strong>再次提交</strong> 覆盖已发生的变动。
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=该合并请求存在冲突,无法进行自动合
pulls.cannot_auto_merge_helper=请手动拉取代码变更以解决冲突。 pulls.cannot_auto_merge_helper=请手动拉取代码变更以解决冲突。
pulls.merge_pull_request=合并请求 pulls.merge_pull_request=合并请求
pulls.open_unmerged_pull_exists=`由于已经存在来自相同仓库和合并信息的未合并请求(#%d),您无法执行重新开启操作。` pulls.open_unmerged_pull_exists=`由于已经存在来自相同仓库和合并信息的未合并请求(#%d),您无法执行重新开启操作。`
pulls.delete_branch=删除分支
pulls.delete_branch_has_new_commits=该分支在完成合并后又推送了新的提交,无法进行删除操作。
milestones.new=新的里程碑 milestones.new=新的里程碑
milestones.open_tab=%d 开启中 milestones.open_tab=%d 开启中
@ -1028,6 +1037,7 @@ auths.delete_auth_title=删除认证操作
auths.delete_auth_desc=该认证将被删除。是否继续? auths.delete_auth_desc=该认证将被删除。是否继续?
auths.still_in_used=此认证仍旧与一些用户有关联,请先删除或者将这些用户转换为其它登录类型。 auths.still_in_used=此认证仍旧与一些用户有关联,请先删除或者将这些用户转换为其它登录类型。
auths.deletion_success=授权源删除成功! auths.deletion_success=授权源删除成功!
auths.login_source_exist=登录源 '%s' 已存在。
config.server_config=服务器配置 config.server_config=服务器配置
config.app_name=应用名称 config.app_name=应用名称

16
conf/locale/locale_zh-HK.ini

@ -137,6 +137,7 @@ issues.in_your_repos=屬於該用戶倉庫的
[explore] [explore]
repos=探索倉庫 repos=探索倉庫
users=用戶 users=用戶
organizations=Organizations
search=搜索 search=搜索
[auth] [auth]
@ -156,7 +157,6 @@ prohibit_login_desc=Your account is prohibited to login, please contact site adm
resent_limit_prompt=對不起,您請求發送激活郵件過於頻繁,請等待 3 分鐘後再試! resent_limit_prompt=對不起,您請求發送激活郵件過於頻繁,請等待 3 分鐘後再試!
has_unconfirmed_mail=%s 您好,您有一封發送至( <b>%s</b>) 但未被確認的郵件。如果您未收到激活郵件,或需要重新發送,請單擊下方的按鈕。 has_unconfirmed_mail=%s 您好,您有一封發送至( <b>%s</b>) 但未被確認的郵件。如果您未收到激活郵件,或需要重新發送,請單擊下方的按鈕。
resend_mail=單擊此處重新發送確認郵件 resend_mail=單擊此處重新發送確認郵件
email_not_associate=您輸入的郵箱地址未被關聯到任何帳號!
send_reset_mail=單擊此處(重新)發送您的密碼重置郵件 send_reset_mail=單擊此處(重新)發送您的密碼重置郵件
reset_password=重置密碼 reset_password=重置密碼
invalid_code=對不起,您的確認代碼已過期或已失效。 invalid_code=對不起,您的確認代碼已過期或已失效。
@ -337,6 +337,10 @@ access_token_deletion=刪除個人的連接token
access_token_deletion_desc=刪除此連接token將會刪除與相關應用程式的連結。您想要繼續嗎? access_token_deletion_desc=刪除此連接token將會刪除與相關應用程式的連結。您想要繼續嗎?
delete_token_success=您的連接token已成功刪除。請記得更新您的應用程式。 delete_token_success=您的連接token已成功刪除。請記得更新您的應用程式。
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=刪除當前帳戶 delete_account=刪除當前帳戶
delete_prompt=刪除操作會永久清除您的帳戶信息,並且 <strong>不可恢復</strong>! delete_prompt=刪除操作會永久清除您的帳戶信息,並且 <strong>不可恢復</strong>!
confirm_delete_account=確認刪除帳戶 confirm_delete_account=確認刪除帳戶
@ -384,7 +388,8 @@ migrate_type=遷移類型
migrate_type_helper=該倉庫將是一個 <span class="text blue">鏡像</span> migrate_type_helper=該倉庫將是一個 <span class="text blue">鏡像</span>
migrate_repo=遷移倉庫 migrate_repo=遷移倉庫
migrate.clone_address=複製地址 migrate.clone_address=複製地址
migrate.clone_address_desc=該地址可以是 HTTP/HTTPS/GIT URL 或本地服務器路徑。 migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=您並沒有導入本地倉庫的權限。 migrate.permission_denied=您並沒有導入本地倉庫的權限。
migrate.invalid_local_path=無效的本地路徑,該路徑不存在或不是一個目錄! migrate.invalid_local_path=無效的本地路徑,該路徑不存在或不是一個目錄!
migrate.failed=遷移失敗:%v migrate.failed=遷移失敗:%v
@ -409,7 +414,7 @@ create_new_repo_command=從命令行創建一個新的倉庫
push_exist_repo=從命令行推送已經創建的倉庫 push_exist_repo=從命令行推送已經創建的倉庫
repo_is_empty=這倉庫不包含任何內容,請稍後再訪問! repo_is_empty=這倉庫不包含任何內容,請稍後再訪問!
code=代碼 files=Files
branch=分支 branch=分支
tree=目錄樹 tree=目錄樹
filter_branch_and_tag=過濾分支或標籤 filter_branch_and_tag=過濾分支或標籤
@ -426,6 +431,7 @@ file_history=文件歷史
file_view_raw=查看原始文件 file_view_raw=查看原始文件
file_permalink=永久連結 file_permalink=永久連結
file_too_large=This file is too large to be shown file_too_large=This file is too large to be shown
video_not_supported_in_browser=Your browser doesn't support HTML5 video tag.
editor.new_file=New file editor.new_file=New file
editor.upload_file=Upload file editor.upload_file=Upload file
@ -455,6 +461,7 @@ editor.cancel=Cancel
editor.filename_cannot_be_empty=Filename cannot be empty. editor.filename_cannot_be_empty=Filename cannot be empty.
editor.branch_already_exists=Branch '%s' already exists in this repository. editor.branch_already_exists=Branch '%s' already exists in this repository.
editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository.
editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor.
editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository.
editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository.
editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes. editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes.
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=由於存在衝突,不能自動合併這推送請
pulls.cannot_auto_merge_helper=請手動合併來解決衝突。 pulls.cannot_auto_merge_helper=請手動合併來解決衝突。
pulls.merge_pull_request=合併請求 pulls.merge_pull_request=合併請求
pulls.open_unmerged_pull_exists=`由於已經存在來自相同倉庫和合併信息的未合併請求(#%d),您無法執行重新開啟操作。` pulls.open_unmerged_pull_exists=`由於已經存在來自相同倉庫和合併信息的未合併請求(#%d),您無法執行重新開啟操作。`
pulls.delete_branch=Delete Branch
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
milestones.new=新的里程碑 milestones.new=新的里程碑
milestones.open_tab=%d 開啟中 milestones.open_tab=%d 開啟中
@ -1028,6 +1037,7 @@ auths.delete_auth_title=刪除認證操作
auths.delete_auth_desc=該認證將被刪除。是否繼續? auths.delete_auth_desc=該認證將被刪除。是否繼續?
auths.still_in_used=This authentication is still used by some users, please delete or convert these users to another login type first. auths.still_in_used=This authentication is still used by some users, please delete or convert these users to another login type first.
auths.deletion_success=認證源刪除成功! auths.deletion_success=認證源刪除成功!
auths.login_source_exist=Login source '%s' already exists.
config.server_config=服務器配置 config.server_config=服務器配置
config.app_name=應用名稱 config.app_name=應用名稱

200
conf/locale/locale_zh-TW.ini

@ -96,8 +96,8 @@ offline_mode=啓用離線模式
offline_mode_popup=在部署模式下也禁用從 CDN 獲取文件,所有的資源將從本地伺服器獲取。 offline_mode_popup=在部署模式下也禁用從 CDN 獲取文件,所有的資源將從本地伺服器獲取。
disable_gravatar=禁用 Gravatar 服務 disable_gravatar=禁用 Gravatar 服務
disable_gravatar_popup=禁用 Gravatar 和自定義源,僅使用由用戶上傳或默認的頭像。 disable_gravatar_popup=禁用 Gravatar 和自定義源,僅使用由用戶上傳或默認的頭像。
federated_avatar_lookup=Enable Federated Avatars Lookup federated_avatar_lookup=開啟聯合頭像查詢
federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. federated_avatar_lookup_popup=開啟聯合頭像查詢並使用基於開放源碼的 libravatar 服務
disable_registration=禁止用戶自主註冊 disable_registration=禁止用戶自主註冊
disable_registration_popup=禁止用戶自主註冊功能,只有管理員可以添加帳號。 disable_registration_popup=禁止用戶自主註冊功能,只有管理員可以添加帳號。
enable_captcha=啟用驗證碼服務 enable_captcha=啟用驗證碼服務
@ -126,7 +126,7 @@ uname_holder=用戶名或郵箱
password_holder=密碼 password_holder=密碼
switch_dashboard_context=切換控制面版用戶 switch_dashboard_context=切換控制面版用戶
my_repos=我的倉庫 my_repos=我的倉庫
show_more_repos=Show more repositories... show_more_repos=顯示更多倉庫...
collaborative_repos=參與協作的倉庫 collaborative_repos=參與協作的倉庫
my_orgs=我的組織 my_orgs=我的組織
my_mirrors=我的鏡像 my_mirrors=我的鏡像
@ -137,6 +137,7 @@ issues.in_your_repos=屬於該用戶倉庫的
[explore] [explore]
repos=探索倉庫 repos=探索倉庫
users=用戶 users=用戶
organizations=Organizations
search=搜索 search=搜索
[auth] [auth]
@ -151,12 +152,11 @@ forget_password=忘記密碼?
sign_up_now=還沒帳戶?馬上註冊。 sign_up_now=還沒帳戶?馬上註冊。
confirmation_mail_sent_prompt=一封新的確認郵件已經被發送至 <b>%s</b>,請檢查您的收件箱並在 %d 小時內完成確認註冊操作。 confirmation_mail_sent_prompt=一封新的確認郵件已經被發送至 <b>%s</b>,請檢查您的收件箱並在 %d 小時內完成確認註冊操作。
active_your_account=激活您的帳戶 active_your_account=激活您的帳戶
prohibit_login=Login Prohibited prohibit_login=禁止登錄
prohibit_login_desc=Your account is prohibited to login, please contact site admin. prohibit_login_desc=您的帳戶被停用,請聯繫網站管理員。
resent_limit_prompt=對不起,您請求發送激活郵件過於頻繁,請等待 3 分鐘後再試! resent_limit_prompt=對不起,您請求發送激活郵件過於頻繁,請等待 3 分鐘後再試!
has_unconfirmed_mail=%s 您好,您有一封發送至( <b>%s</b>) 但未被確認的郵件。如果您未收到激活郵件,或需要重新發送,請單擊下方的按鈕。 has_unconfirmed_mail=%s 您好,您有一封發送至( <b>%s</b>) 但未被確認的郵件。如果您未收到激活郵件,或需要重新發送,請單擊下方的按鈕。
resend_mail=單擊此處重新發送確認郵件 resend_mail=單擊此處重新發送確認郵件
email_not_associate=您輸入的郵箱地址未被關聯到任何帳號!
send_reset_mail=單擊此處(重新)發送您的密碼重置郵件 send_reset_mail=單擊此處(重新)發送您的密碼重置郵件
reset_password=重置密碼 reset_password=重置密碼
invalid_code=對不起,您的確認代碼已過期或已失效。 invalid_code=對不起,您的確認代碼已過期或已失效。
@ -189,12 +189,12 @@ TeamName=團隊名稱
AuthName=認證名稱 AuthName=認證名稱
AdminEmail=管理員郵箱 AdminEmail=管理員郵箱
NewBranchName=New branch name NewBranchName=新的分支名稱
CommitSummary=Commit summary CommitSummary=提交摘要
CommitMessage=Commit message CommitMessage=提交訊息
CommitChoice=Commit choice CommitChoice=提交選擇
TreeName=File path TreeName=檔案路徑
Content=Content Content=內容
require_error=不能為空。 require_error=不能為空。
alpha_dash_error=必須為英文字母、阿拉伯數字或橫線(-_)。 alpha_dash_error=必須為英文字母、阿拉伯數字或橫線(-_)。
@ -248,7 +248,7 @@ form.name_pattern_not_allowed=用戶名不允許 '%s' 的格式。
[settings] [settings]
profile=個人信息 profile=個人信息
password=修改密碼 password=修改密碼
avatar=Avatar avatar=頭像
ssh_keys=管理 SSH 密鑰 ssh_keys=管理 SSH 密鑰
social=社交帳號綁定 social=社交帳號綁定
applications=管理授權應用 applications=管理授權應用
@ -269,8 +269,8 @@ change_username_prompt=該操作將會影響到所有與您帳戶有關的鏈接
continue=繼續操作 continue=繼續操作
cancel=取消操作 cancel=取消操作
lookup_avatar_by_mail=Lookup Avatar by mail lookup_avatar_by_mail=通過信箱查找頭像
federated_avatar_lookup=Federated Avatar Lookup federated_avatar_lookup=Federated Avatar 查詢
enable_custom_avatar=啟動自定義頭像 enable_custom_avatar=啟動自定義頭像
choose_new_avatar=選擇新的頭像 choose_new_avatar=選擇新的頭像
update_avatar=更新頭像設置 update_avatar=更新頭像設置
@ -337,6 +337,10 @@ access_token_deletion=刪除個人的連接token
access_token_deletion_desc=刪除此連接token將會刪除與相關應用程式的連結。您想要繼續嗎? access_token_deletion_desc=刪除此連接token將會刪除與相關應用程式的連結。您想要繼續嗎?
delete_token_success=您的連接token已成功刪除。請記得更新您的應用程式。 delete_token_success=您的連接token已成功刪除。請記得更新您的應用程式。
orgs.none=You are not a member of any organizations.
orgs.leave_title=Leave an organization
orgs.leave_desc=You will lose access to all repositories and teams after you left the organization. Do you want to continue?
delete_account=刪除當前帳戶 delete_account=刪除當前帳戶
delete_prompt=刪除操作會永久清除您的帳戶信息,並且 <strong>不可恢復</strong>! delete_prompt=刪除操作會永久清除您的帳戶信息,並且 <strong>不可恢復</strong>!
confirm_delete_account=確認刪除帳戶 confirm_delete_account=確認刪除帳戶
@ -357,7 +361,7 @@ fork_from=派生自
fork_visiblity_helper=派生倉庫無法修改可見性。 fork_visiblity_helper=派生倉庫無法修改可見性。
repo_desc=倉庫描述 repo_desc=倉庫描述
repo_lang=倉庫語言 repo_lang=倉庫語言
repo_gitignore_helper=Select .gitignore templates repo_gitignore_helper=選擇 .gitignore 主題
license=授權許可 license=授權許可
license_helper=請選擇授權許可文件 license_helper=請選擇授權許可文件
readme=Readme readme=Readme
@ -370,7 +374,7 @@ mirror_prune_desc=當遠程追蹤的引用被刪除時本地也會同步刪除
mirror_interval=鏡像同步周期(小時) mirror_interval=鏡像同步周期(小時)
mirror_address=鏡像地址 mirror_address=鏡像地址
mirror_address_desc=請在位址中包括必要的使用者憑據。 mirror_address_desc=請在位址中包括必要的使用者憑據。
mirror_last_synced=Last Synced mirror_last_synced=上次同步
watchers=關注者 watchers=關注者
stargazers=稱讚者 stargazers=稱讚者
forks=派生倉庫 forks=派生倉庫
@ -384,7 +388,8 @@ migrate_type=遷移類型
migrate_type_helper=該倉庫將是一個 <span class="text blue">鏡像</span> migrate_type_helper=該倉庫將是一個 <span class="text blue">鏡像</span>
migrate_repo=遷移倉庫 migrate_repo=遷移倉庫
migrate.clone_address=複製地址 migrate.clone_address=複製地址
migrate.clone_address_desc=該地址可以是 HTTP/HTTPS/GIT URL 或本地服務器路徑。 migrate.clone_address_desc=This can be a HTTP/HTTPS/GIT URL.
migrate.clone_address_desc_import_local=You're also allowed to migrate a repository by local server path.
migrate.permission_denied=您並沒有導入本地倉庫的權限。 migrate.permission_denied=您並沒有導入本地倉庫的權限。
migrate.invalid_local_path=無效的本地路徑,該路徑不存在或不是一個目錄! migrate.invalid_local_path=無效的本地路徑,該路徑不存在或不是一個目錄!
migrate.failed=遷移失敗:%v migrate.failed=遷移失敗:%v
@ -409,7 +414,7 @@ create_new_repo_command=從命令行創建一個新的倉庫
push_exist_repo=從命令行推送已經創建的倉庫 push_exist_repo=從命令行推送已經創建的倉庫
repo_is_empty=這倉庫不包含任何內容,請稍後再訪問! repo_is_empty=這倉庫不包含任何內容,請稍後再訪問!
code=代碼 files=Files
branch=分支 branch=分支
tree=目錄樹 tree=目錄樹
filter_branch_and_tag=過濾分支或標籤 filter_branch_and_tag=過濾分支或標籤
@ -425,45 +430,47 @@ file_raw=原始文件
file_history=文件歷史 file_history=文件歷史
file_view_raw=查看原始文件 file_view_raw=查看原始文件
file_permalink=永久連結 file_permalink=永久連結
file_too_large=This file is too large to be shown file_too_large=檔案太大,無法顯示
video_not_supported_in_browser=Your browser doesn't support HTML5 video tag.
editor.new_file=New file
editor.upload_file=Upload file editor.new_file=開新檔案
editor.edit_file=Edit file editor.upload_file=上傳檔案
editor.preview_changes=Preview Changes editor.edit_file=編輯文件
editor.cannot_edit_non_text_files=Cannot edit non-text files editor.preview_changes=預覽更改
editor.edit_this_file=Edit this file editor.cannot_edit_non_text_files=不能編輯非文字檔
editor.must_be_on_a_branch=You must be on a branch to make or propose changes to this file editor.edit_this_file=編輯此文件
editor.fork_before_edit=You must fork this repository before editing the file editor.must_be_on_a_branch=你必須在一個分支或提出對此檔的更改
editor.delete_this_file=Delete this file editor.fork_before_edit=你必須在編輯檔案之前備份此檔案
editor.must_have_write_access=You must have write access to make or propose changes to this file editor.delete_this_file=刪除此文件
editor.file_delete_success=File '%s' has been deleted successfully! editor.must_have_write_access=您必須具有寫存取權限,或提出對此檔案的更改
editor.name_your_file=Name your file... editor.file_delete_success=已成功刪除 '%s' !
editor.filename_help=To add directory, just type it and press /. To remove a directory, go to the beginning of the field and press backspace. editor.name_your_file=命名您的檔...
editor.or=or editor.filename_help=輸入名稱後按下 / 鍵即可新增資料夾,或將滑鼠移至輸入格最左側按下Backspace移除資料夾。
editor.cancel_lower=cancel editor.or=
editor.commit_changes=Commit Changes editor.cancel_lower=取消
editor.add_tmpl=Add '%s/<filename>' editor.commit_changes=提交更改嗎?
editor.add=Add '%s' editor.add_tmpl=添加%s/<filename>'
editor.update=Update '%s' editor.add=新增 '%s'
editor.delete=Delete '%s' editor.update=更新 '%s'
editor.commit_message_desc=Add an optional extended description... editor.delete=刪除 '%s'
editor.commit_directly_to_this_branch=Commit directly to the <strong class="branch-name">%s</strong> branch. editor.commit_message_desc=添加一個可選的擴展描述...
editor.create_new_branch=Create a <strong>new branch</strong> for this commit and start a pull request. editor.commit_directly_to_this_branch=直接提交到 <strong class="branch-name">%s</strong> 分支。
editor.new_branch_name_desc=New branch name... editor.create_new_branch=創建 <strong>新的分支</strong> 為此提交和開始合併請求。
editor.cancel=Cancel editor.new_branch_name_desc=新的分支名稱...
editor.filename_cannot_be_empty=Filename cannot be empty. editor.cancel=取消
editor.branch_already_exists=Branch '%s' already exists in this repository. editor.filename_cannot_be_empty=檔案名不能為空。
editor.directory_is_a_file=Entry '%s' in the parent path is a file not a directory in this repository. editor.branch_already_exists='%s' 已存在於此存儲庫。
editor.filename_is_a_directory=The filename '%s' is an existing directory in this repository. editor.directory_is_a_file='%s' 在此倉庫中的路徑是檔案而不是目錄。
editor.file_editing_no_longer_exists=The file '%s' you are editing no longer exists in the repository. editor.file_is_a_symlink=The file '%s' is a symlink that cannot be modified from the web editor.
editor.file_changed_while_editing=File content has been changed since you started editing. <a target="_blank" href="%s">Click here</a> to see what have been changed or <strong>press commit again</strong> to overwrite those changes. editor.filename_is_a_directory=檔案名 '%s' 是此資料庫中的現有目錄。
editor.file_already_exists=A file with name '%s' already exists in this repository. editor.file_editing_no_longer_exists=檔 '%s' 您正在編輯不再存在於資料庫。
editor.no_changes_to_show=There are no changes to show. editor.file_changed_while_editing=從您開始編輯已更改檔的內容。<a target="_blank"href="%s"> 按一下此處</a> 以查看什麼發生了更改或 <strong>按提交再</strong> 覆蓋這些更改。
editor.fail_to_update_file=Failed to update/create file '%s' with error: %v editor.file_already_exists=帶有名稱 '%s' 的檔已經存在在這個資料庫中。
editor.add_subdir=Add subdirectory... editor.no_changes_to_show=沒有可以顯示的變更。
editor.unable_to_upload_files=Failed to upload files to '%s' with error: %v editor.fail_to_update_file=上傳/創建檔案 '%s' 失敗, 錯誤訊息: %v
editor.upload_files_to_dir=Upload files to '%s' editor.add_subdir=新增子目錄...
editor.unable_to_upload_files=上傳檔案失敗到 '%s', 錯誤訊息: %v
editor.upload_files_to_dir=上傳檔案到 '%s'
commits.commits=次代碼提交 commits.commits=次代碼提交
commits.search=搜索提交歷史 commits.search=搜索提交歷史
@ -490,11 +497,11 @@ issues.create=創建問題
issues.new_label=創建標籤 issues.new_label=創建標籤
issues.new_label_placeholder=標籤名稱... issues.new_label_placeholder=標籤名稱...
issues.create_label=創建標籤 issues.create_label=創建標籤
issues.label_templates.title=Load a predefined set of labels issues.label_templates.title=載入一組預定義的標籤
issues.label_templates.info=There aren’t any labels yet. You can click on the "New Label" button above to create one or use a predefined set below. issues.label_templates.info=沒有任何標籤。你可以點選上面創建一個或按下面"新建標籤"按鈕來使用一組預定義。
issues.label_templates.helper=Select a label set issues.label_templates.helper=選擇一個標籤集
issues.label_templates.use=Use this label set issues.label_templates.use=使用此標籤集
issues.label_templates.fail_to_load_file=Failed to load label template file '%s': %v issues.label_templates.fail_to_load_file=載入標籤範本檔案 '%s' 失敗: %v
issues.open_tab=%d 個開啓中 issues.open_tab=%d 個開啓中
issues.close_tab=%d 個已關閉 issues.close_tab=%d 個已關閉
issues.filter_label=標籤篩選 issues.filter_label=標籤篩選
@ -522,8 +529,8 @@ issues.next=下一頁
issues.open_title=開啟中 issues.open_title=開啟中
issues.closed_title=已關閉 issues.closed_title=已關閉
issues.num_comments=%d 條評論 issues.num_comments=%d 條評論
issues.commented_at=`commented <a href="#%s">%s</a>` issues.commented_at=` 評論 <a href="#%s"> %s'</a>`
issues.delete_comment_confirm=Are you sure you want to delete this comment? issues.delete_comment_confirm=您確定要刪除該條評論嗎?
issues.no_content=尚未有任何內容 issues.no_content=尚未有任何內容
issues.close_issue=關閉 issues.close_issue=關閉
issues.close_comment_issue=關閉及評論 issues.close_comment_issue=關閉及評論
@ -536,7 +543,7 @@ issues.commit_ref_at=`在代碼提交 <a id="%[1]s" href="#%[1]s">%[2]s</a> 中
issues.poster=發佈者 issues.poster=發佈者
issues.collaborator=協同者 issues.collaborator=協同者
issues.owner=所有者 issues.owner=所有者
issues.sign_in_require_desc=<a href="%s">Sign in</a> to join this conversation. issues.sign_in_require_desc=<a href="%s"> 登入</a> 才能加入這對話。
issues.edit=編輯 issues.edit=編輯
issues.cancel=取消 issues.cancel=取消
issues.save=保存 issues.save=保存
@ -551,8 +558,8 @@ issues.label_deletion=刪除標籤
issues.label_deletion_desc=刪除該標籤將會移除所有問題中相關的訊息。是否繼續? issues.label_deletion_desc=刪除該標籤將會移除所有問題中相關的訊息。是否繼續?
issues.label_deletion_success=標籤刪除成功! issues.label_deletion_success=標籤刪除成功!
issues.num_participants=%d 參與者 issues.num_participants=%d 參與者
issues.attachment.open_tab=`Click to see "%s" in a new tab` issues.attachment.open_tab=`在新的標籤頁中查看 '%s'`
issues.attachment.download=`Click to download "%s"` issues.attachment.download=`點擊下載 '%s'`
pulls.new=創建合併請求 pulls.new=創建合併請求
pulls.compare_changes=對比文件變化 pulls.compare_changes=對比文件變化
@ -579,6 +586,8 @@ pulls.cannot_auto_merge_desc=由於存在衝突,不能自動合併這推送請
pulls.cannot_auto_merge_helper=請手動合併來解決衝突。 pulls.cannot_auto_merge_helper=請手動合併來解決衝突。
pulls.merge_pull_request=合併請求 pulls.merge_pull_request=合併請求
pulls.open_unmerged_pull_exists=`由於已經存在來自相同倉庫和合併信息的未合併請求(#%d),您無法執行重新開啟操作。` pulls.open_unmerged_pull_exists=`由於已經存在來自相同倉庫和合併信息的未合併請求(#%d),您無法執行重新開啟操作。`
pulls.delete_branch=Delete Branch
pulls.delete_branch_has_new_commits=Branch cannot be deleted because it has new commits after mergence.
milestones.new=新的里程碑 milestones.new=新的里程碑
milestones.open_tab=%d 開啟中 milestones.open_tab=%d 開啟中
@ -632,25 +641,25 @@ settings.collaboration.undefined=未定義
settings.hooks=管理 Web 鉤子 settings.hooks=管理 Web 鉤子
settings.githooks=管理 Git 鉤子 settings.githooks=管理 Git 鉤子
settings.basic_settings=基本設置 settings.basic_settings=基本設置
settings.mirror_settings=Mirror Settings settings.mirror_settings=鏡像設定
settings.sync_mirror=Sync Now settings.sync_mirror=立即同步
settings.mirror_sync_in_progress=Mirror syncing is in progress, please refresh page in about a minute. settings.mirror_sync_in_progress=鏡像同步正在進行中,請大約一分鐘後刷新頁面。
settings.site=官方網站 settings.site=官方網站
settings.update_settings=更新倉庫設置 settings.update_settings=更新倉庫設置
settings.change_reponame_prompt=該操作將會影響到所有與該倉庫有關的鏈接 settings.change_reponame_prompt=該操作將會影響到所有與該倉庫有關的鏈接
settings.advanced_settings=高級設置 settings.advanced_settings=高級設置
settings.wiki_desc=Enable wiki system settings.wiki_desc=啓用 Wiki 系統
settings.use_internal_wiki=Use builtin wiki settings.use_internal_wiki=使用內建 wiki
settings.use_external_wiki=使用外部 wiki settings.use_external_wiki=使用外部 wiki
settings.external_wiki_url=外部 Wiki 連結 settings.external_wiki_url=外部 Wiki 連結
settings.external_wiki_url_desc=當分頁上按一下,訪客將會重新導到 URL。 settings.external_wiki_url_desc=當分頁上按一下,訪客將會重新導到 URL。
settings.issues_desc=Enable issue tracker settings.issues_desc=啟用問題追蹤
settings.use_internal_issue_tracker=Use builtin lightweight issue tracker settings.use_internal_issue_tracker=使用內建輕量級問題追蹤
settings.use_external_issue_tracker=使用外部的問題管理系統 settings.use_external_issue_tracker=使用外部的問題管理系統
settings.tracker_url_format=外部問題管理系統的 URL 格式 settings.tracker_url_format=外部問題管理系統的 URL 格式
settings.tracker_issue_style=外部公單管理系統命名風格: settings.tracker_issue_style=外部公單管理系統命名風格:
settings.tracker_issue_style.numeric=Numeric settings.tracker_issue_style.numeric=數字
settings.tracker_issue_style.alphanumeric=Alphanumeric settings.tracker_issue_style.alphanumeric=字母及數字
settings.tracker_url_format_desc=您可以使用 <code>{user} {repo} {index}</code> 分別作為用戶名、倉庫名和問題索引的占位符。 settings.tracker_url_format_desc=您可以使用 <code>{user} {repo} {index}</code> 分別作為用戶名、倉庫名和問題索引的占位符。
settings.pulls_desc=啟用合併請求以接受社區貢獻 settings.pulls_desc=啟用合併請求以接受社區貢獻
settings.danger_zone=危險操作區 settings.danger_zone=危險操作區
@ -720,8 +729,8 @@ settings.event_send_everything=推送 <strong>所有</strong> 事件
settings.event_choose=讓我選擇我的需要 settings.event_choose=讓我選擇我的需要
settings.event_create=創建 settings.event_create=創建
settings.event_create_desc=創建分支或標籤 settings.event_create_desc=創建分支或標籤
settings.event_pull_request=Pull Request settings.event_pull_request=合併請求
settings.event_pull_request_desc=Pull request opened, closed, reopened, edited, assigned, unassigned, label updated, label cleared, or synchronized. settings.event_pull_request_desc=請求打開,關閉,重新打開,編輯,分配,未分配,標籤更新,標籤清除,或同步。
settings.event_push=推送 settings.event_push=推送
settings.event_push_desc=Git 倉庫推送 settings.event_push_desc=Git 倉庫推送
settings.active=是否激活 settings.active=是否激活
@ -759,7 +768,7 @@ diff.show_unified_view=統一視圖
diff.stats_desc=共有 <strong> %d 個文件被更改</strong>,包括 <strong>%d 次插入</strong> 和 <strong>%d 次删除</strong> diff.stats_desc=共有 <strong> %d 個文件被更改</strong>,包括 <strong>%d 次插入</strong> 和 <strong>%d 次删除</strong>
diff.bin=二進制 diff.bin=二進制
diff.view_file=查看文件 diff.view_file=查看文件
diff.file_suppressed=File diff suppressed because it is too large diff.file_suppressed=文件差異過大導致無法顯示
diff.too_many_files=部分文件因文件數量過多而無法顯示 diff.too_many_files=部分文件因文件數量過多而無法顯示
release.releases=版本發佈 release.releases=版本發佈
@ -791,7 +800,7 @@ release.deletion=刪除版本發布操作
release.deletion_desc=刪除該版本發布將會移除相應的 Git 標籤。是否繼續? release.deletion_desc=刪除該版本發布將會移除相應的 Git 標籤。是否繼續?
release.deletion_success=版本發布刪除成功! release.deletion_success=版本發布刪除成功!
release.tag_name_already_exist=已經存在使用相同標籤的發佈版本。 release.tag_name_already_exist=已經存在使用相同標籤的發佈版本。
release.tag_name_invalid=Tag name is not valid. release.tag_name_invalid=標記名稱不是有效的。
release.downloads=下載附件 release.downloads=下載附件
[org] [org]
@ -959,7 +968,7 @@ users.edit_account=編輯用戶信息
users.max_repo_creation=最大儲存庫新增限制 users.max_repo_creation=最大儲存庫新增限制
users.max_repo_creation_desc=(設定 -1 使用全域預設限制) users.max_repo_creation_desc=(設定 -1 使用全域預設限制)
users.is_activated=該用戶已被激活 users.is_activated=該用戶已被激活
users.prohibit_login=This account is prohibited to login users.prohibit_login=此帳戶禁止登錄
users.is_admin=該用戶具有管理員權限 users.is_admin=該用戶具有管理員權限
users.allow_git_hook=該帳戶具有創建 Git 鉤子的權限 users.allow_git_hook=該帳戶具有創建 Git 鉤子的權限
users.allow_import_local=該用戶具有導入本地倉庫的權限 users.allow_import_local=該用戶具有導入本地倉庫的權限
@ -1028,6 +1037,7 @@ auths.delete_auth_title=刪除認證操作
auths.delete_auth_desc=該認證將被刪除。是否繼續? auths.delete_auth_desc=該認證將被刪除。是否繼續?
auths.still_in_used=一些使用者仍然使用此驗證方式,請先刪除或轉換這些使用者到其它登入類型。 auths.still_in_used=一些使用者仍然使用此驗證方式,請先刪除或轉換這些使用者到其它登入類型。
auths.deletion_success=認證源刪除成功! auths.deletion_success=認證源刪除成功!
auths.login_source_exist=Login source '%s' already exists.
config.server_config=服務器配置 config.server_config=服務器配置
config.app_name=應用名稱 config.app_name=應用名稱
@ -1113,19 +1123,19 @@ config.cookie_life_time=Cookie 生命周期
config.picture_config=圖片配置 config.picture_config=圖片配置
config.picture_service=圖片服務 config.picture_service=圖片服務
config.disable_gravatar=禁用 Gravatar 頭像 config.disable_gravatar=禁用 Gravatar 頭像
config.enable_federated_avatar=Enable Federated Avatars config.enable_federated_avatar=開啟聯合頭像
config.git_config=Git Configuration config.git_config=Git 配置
config.git_disable_diff_highlight=Disable Diff Syntax Highlight config.git_disable_diff_highlight=禁用比較語法高亮
config.git_max_diff_lines=Max Diff Lines (for a single file) config.git_max_diff_lines=Max Diff 線 (對於單個檔)
config.git_max_diff_line_characters=Max Diff Characters (for a single line) config.git_max_diff_line_characters=最大比較的字元 (單行)
config.git_max_diff_files=Max Diff Files (to be shown) config.git_max_diff_files=Max Diff 檔 (顯示)
config.git_gc_args=GC Arguments config.git_gc_args=GC 參數
config.git_migrate_timeout=Migration Timeout config.git_migrate_timeout=移動超時
config.git_mirror_timeout=Mirror Update Timeout config.git_mirror_timeout=鏡像更新超時
config.git_clone_timeout=Clone Operation Timeout config.git_clone_timeout=複製操作超時
config.git_pull_timeout=Pull Operation Timeout config.git_pull_timeout=操作超時
config.git_gc_timeout=GC Operation Timeout config.git_gc_timeout=GC 操作超時
config.log_config=日誌配置 config.log_config=日誌配置
config.log_mode=日誌模式 config.log_mode=日誌模式

66
glide.lock generated

@ -2,13 +2,13 @@ hash: 1d5fcf2a90f7621ecbc0b1abed548e11d13bda3fea49b4326c829a523268e5cf
updated: 2016-06-12T17:35:14.27036884+08:00 updated: 2016-06-12T17:35:14.27036884+08:00
imports: imports:
- name: github.com/bradfitz/gomemcache - name: github.com/bradfitz/gomemcache
version: fb1f79c6b65acda83063cbc69f6bba1522558bfc version: 2fafb84a66c4911e11a8f50955b01e74fe3ab9c5
subpackages: subpackages:
- memcache - memcache
- name: github.com/urfave/cli - name: github.com/urfave/cli
version: 1efa31f08b9333f1bd4882d61f9d668a70cd902e version: 347a9884a87374d000eec7e6445a34487c1f4a2b
- name: github.com/go-macaron/binding - name: github.com/go-macaron/binding
version: 9440f336b443056c90d7d448a0a55ad8c7599880 version: 48920167fa152d02f228cfbece7e0f1e452d200a
- name: github.com/go-macaron/cache - name: github.com/go-macaron/cache
version: 56173531277692bc2925924d51fda1cd0a6b8178 version: 56173531277692bc2925924d51fda1cd0a6b8178
subpackages: subpackages:
@ -23,7 +23,7 @@ imports:
- name: github.com/go-macaron/i18n - name: github.com/go-macaron/i18n
version: ef57533c3b0fc2d8581deda14937e52f11a203ab version: ef57533c3b0fc2d8581deda14937e52f11a203ab
- name: github.com/go-macaron/inject - name: github.com/go-macaron/inject
version: c5ab7bf3a307593cd44cb272d1a5beea473dd072 version: d8a0b8677191f4380287cfebd08e462217bac7ad
- name: github.com/go-macaron/session - name: github.com/go-macaron/session
version: 66031fcb37a0fff002a1f028eb0b3a815c78306b version: 66031fcb37a0fff002a1f028eb0b3a815c78306b
subpackages: subpackages:
@ -31,62 +31,64 @@ imports:
- name: github.com/go-macaron/toolbox - name: github.com/go-macaron/toolbox
version: 82b511550b0aefc36b3a28062ad3a52e812bee38 version: 82b511550b0aefc36b3a28062ad3a52e812bee38
- name: github.com/go-sql-driver/mysql - name: github.com/go-sql-driver/mysql
version: 0b58b37b664c21f3010e836f1b931e1d0b0b0685 version: 2e00b5cd70399450106cec6431c2e2ce3cae5034
- name: github.com/go-xorm/builder
version: 867edcc549127f15667ece8876c3a60093c9634b
- name: github.com/go-xorm/core - name: github.com/go-xorm/core
version: 5bf745d7d163f4380e6c2bba8c4afa60534dd087 version: 2fbe2c76c6781d9e1c0398fc25386426e611f975
- name: github.com/go-xorm/xorm - name: github.com/go-xorm/xorm
version: c6c705684057842d9854e8299dd51abb06ae29f5 version: 445a934d32ed0934aedf0ef99b4b7c69b22f8e58
- name: github.com/gogits/chardet - name: github.com/gogits/chardet
version: 2404f777256163ea3eadb273dada5dcb037993c0 version: 2404f777256163ea3eadb273dada5dcb037993c0
- name: github.com/gogits/cron - name: github.com/gogits/cron
version: 7f3990acf1833faa5ebd0e86f0a4c72a4b5eba3c version: 2fc07a4c4f1e3c4d2301c5ed578d5e2c31c70421
- name: github.com/gogits/git-module - name: github.com/gogits/git-module
version: 5e0c1330d7853d1affbc193885d517db0f8d1ca5 version: 172cbc21accbf0085a58fd0832f46a9f694130e8
- name: github.com/gogits/go-gogs-client - name: github.com/gogits/go-gogs-client
version: c52f7ee0cc58d3cd6e379025552873a8df6de322 version: 98046bb98061fc6baa5bb86359af0b7c300d384a
- name: github.com/gogits/go-libravatar
version: cd1abbd55d09b793672732a7a1dfdaa12a40dfd0
- name: github.com/issue9/identicon - name: github.com/issue9/identicon
version: d36b54562f4cf70c83653e13dc95c220c79ef521 version: d36b54562f4cf70c83653e13dc95c220c79ef521
- name: github.com/jaytaylor/html2text - name: github.com/jaytaylor/html2text
version: 52d9b785554a1918cb09909b89a1509a98b853fd version: d16d4129aab4e6be4497f4db898965f09b93b565
- name: github.com/kardianos/minwinsvc - name: github.com/kardianos/minwinsvc
version: cad6b2b879b0970e4245a20ebf1a81a756e2bb70 version: cad6b2b879b0970e4245a20ebf1a81a756e2bb70
- name: github.com/klauspost/compress - name: github.com/klauspost/compress
version: 14eb9c4951195779ecfbec34431a976de7335b0a version: 461e8fd8397ae84a23f56e385801e4feda2048ce
subpackages: subpackages:
- gzip - gzip
- flate - flate
- name: github.com/klauspost/cpuid - name: github.com/klauspost/cpuid
version: 09cded8978dc9e80714c4d85b0322337b0a1e5e0 version: 09cded8978dc9e80714c4d85b0322337b0a1e5e0
- name: github.com/klauspost/crc32 - name: github.com/klauspost/crc32
version: 19b0b332c9e4516a6370a0456e6182c3b5036720 version: cb6bfca970f6908083f26f39a79009d608efd5cd
- name: github.com/lib/pq - name: github.com/lib/pq
version: 80f8150043c80fb52dee6bc863a709cdac7ec8f8 version: 67c3f2a8884c9b1aac5503c8d42ae4f73a93511c
subpackages: subpackages:
- oid - oid
- name: github.com/mattn/go-sqlite3 - name: github.com/mattn/go-sqlite3
version: e118d4451349065b8e7ce0f0af32e033995363f8 version: ce9149a3c941c30de51a01dbc5bc414ddaa52927
- name: github.com/mcuadros/go-version - name: github.com/mcuadros/go-version
version: d52711f8d6bea8dc01efafdb68ad95a4e2606630 version: 257f7b9a7d87427c8d7f89469a5958d57f8abd7c
- name: github.com/microcosm-cc/bluemonday - name: github.com/microcosm-cc/bluemonday
version: 9dc199233bf72cc1aad9b61f73daf2f0075b9ee4 version: e79763773ab6222ca1d5a7cbd9d62d83c1f77081
- name: github.com/msteinert/pam - name: github.com/msteinert/pam
version: 02ccfbfaf0cc627aa3aec8ef7ed5cfeec5b43f63 version: 02ccfbfaf0cc627aa3aec8ef7ed5cfeec5b43f63
- name: github.com/nfnt/resize - name: github.com/nfnt/resize
version: 891127d8d1b52734debe1b3c3d7e747502b6c366 version: 891127d8d1b52734debe1b3c3d7e747502b6c366
- name: github.com/russross/blackfriday - name: github.com/russross/blackfriday
version: 93622da34e54fb6529bfb7c57e710f37a8d9cbd8 version: 5f33e7b7878355cd2b7e6b8eefc48a5472c69f70
- name: github.com/satori/go.uuid - name: github.com/satori/go.uuid
version: 0aa62d5ddceb50dbcb909d790b5345affd3669b6 version: b061729afc07e77a8aa4fad0a2fd840958f1942a
- name: github.com/sergi/go-diff - name: github.com/sergi/go-diff
version: ec7fdbb58eb3e300c8595ad5ac74a5aa50019cc7 version: 24e2351369ec4949b2ed0dc5c477afdd4c4034e8
subpackages: subpackages:
- diffmatchpatch - diffmatchpatch
- name: github.com/strk/go-libravatar
version: 5eed7bff870ae19ef51c5773dbc8f3e9fcbd0982
- name: github.com/shurcooL/sanitized_anchor_name - name: github.com/shurcooL/sanitized_anchor_name
version: 10ef21a441db47d8b13ebcc5fd2310f636973c77 version: 1dba4b3954bc059efc3991ec364f9f9a35f597d2
- name: github.com/Unknwon/cae - name: github.com/Unknwon/cae
version: 7f5e046bc8a6c3cde743c233b96ee4fd84ee6ecd version: c6aac99ea2cae2ebaf23f26f76b04fe3fcfc9f8c
subpackages: subpackages:
- zip - zip
- name: github.com/Unknwon/com - name: github.com/Unknwon/com
@ -94,27 +96,27 @@ imports:
- name: github.com/Unknwon/i18n - name: github.com/Unknwon/i18n
version: 39d6f2727e0698b1021ceb6a77c1801aa92e7d5d version: 39d6f2727e0698b1021ceb6a77c1801aa92e7d5d
- name: github.com/Unknwon/paginater - name: github.com/Unknwon/paginater
version: 7748a72e01415173a27d79866b984328e7b0c12b version: 701c23f468663c34d1b1768c3ae1bcc57e11c5b3
- name: golang.org/x/crypto - name: golang.org/x/crypto
version: bc89c496413265e715159bdc8478ee9a92fdc265 version: dc137beb6cce2043eb6b5f223ab8bf51c32459f4
subpackages: subpackages:
- ssh - ssh
- curve25519 - curve25519
- ed25519 - ed25519
- ed25519/internal/edwards25519 - ed25519/internal/edwards25519
- name: golang.org/x/net - name: golang.org/x/net
version: 57bfaa875b96fb91b4766077f34470528d4b03e9 version: f2499483f923065a842d38eb4c7f1927e6fc6e6d
subpackages: subpackages:
- html - html
- html/charset - html/charset
- html/atom - html/atom
- name: golang.org/x/sys - name: golang.org/x/sys
version: a646d33e2ee3172a661fc09bca23bb4889a41bc8 version: d75a52659825e75fff6158388dddc6a5b04f9ba5
subpackages: subpackages:
- windows/svc - windows/svc
- windows - windows
- name: golang.org/x/text - name: golang.org/x/text
version: 2910a502d2bf9e43193af9d68ca516529614eed3 version: ece019dcfd29abcf65d0d1dfe145e8faad097640
subpackages: subpackages:
- transform - transform
- language - language
@ -142,11 +144,11 @@ imports:
- name: gopkg.in/gomail.v2 - name: gopkg.in/gomail.v2
version: 81ebce5c23dfd25c6c67194b37d3dd3f338c98b1 version: 81ebce5c23dfd25c6c67194b37d3dd3f338c98b1
- name: gopkg.in/ini.v1 - name: gopkg.in/ini.v1
version: cf53f9204df4fbdd7ec4164b57fa6184ba168292 version: e3c2d47c61e5333f9aa2974695dd94396eb69c75
- name: gopkg.in/ldap.v2 - name: gopkg.in/ldap.v2
version: d0a5ced67b4dc310b9158d63a2c6f9c5ec13f105 version: 8168ee085ee43257585e50c6441aadf54ecb2c9f
- name: gopkg.in/macaron.v1 - name: gopkg.in/macaron.v1
version: 7564489a79f3f96b7ac8034652b35eeebb468eb4 version: 78521e4647ad5dcbabd5734d94582ca2373cbad8
- name: gopkg.in/redis.v2 - name: gopkg.in/redis.v2
version: e6179049628164864e6e84e973cfb56335748dea version: e6179049628164864e6e84e973cfb56335748dea
devImports: [] devImports: []

7
gogs.go

@ -1,4 +1,4 @@
// +build go1.4 // +build go1.5
// Copyright 2014 The Gogs Authors. All rights reserved. // Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style // Use of this source code is governed by a MIT-style
@ -9,7 +9,6 @@ package main
import ( import (
"os" "os"
"runtime"
"github.com/urfave/cli" "github.com/urfave/cli"
@ -17,10 +16,9 @@ import (
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
) )
const APP_VER = "0.9.99.0915" const APP_VER = "0.9.131.0201"
func init() { func init() {
runtime.GOMAXPROCS(runtime.NumCPU())
setting.AppVer = APP_VER setting.AppVer = APP_VER
} }
@ -36,6 +34,7 @@ func main() {
cmd.CmdDump, cmd.CmdDump,
cmd.CmdCert, cmd.CmdCert,
cmd.CmdAdmin, cmd.CmdAdmin,
cmd.CmdImport,
} }
app.Flags = append(app.Flags, []cli.Flag{}...) app.Flags = append(app.Flags, []cli.Flag{}...)
app.Run(os.Args) app.Run(os.Args)

2
models/action.go

@ -63,7 +63,7 @@ func init() {
IssueReferenceKeywordsPat = regexp.MustCompile(`(?i)(?:)(^| )\S+`) IssueReferenceKeywordsPat = regexp.MustCompile(`(?i)(?:)(^| )\S+`)
} }
// Action represents user operation type and other information to repository., // Action represents user operation type and other information to repository,
// it implemented interface base.Actioner so that can be used in template render. // it implemented interface base.Actioner so that can be used in template render.
type Action struct { type Action struct {
ID int64 `xorm:"pk autoincr"` ID int64 `xorm:"pk autoincr"`

3
models/admin.go

@ -77,7 +77,8 @@ func RemoveAllWithNotice(title, path string) {
// workaround for Go not being able to remove read-only files/folders: https://github.com/golang/go/issues/9606 // workaround for Go not being able to remove read-only files/folders: https://github.com/golang/go/issues/9606
// this bug should be fixed on Go 1.7, so the workaround should be removed when Gogs don't support Go 1.6 anymore: // this bug should be fixed on Go 1.7, so the workaround should be removed when Gogs don't support Go 1.6 anymore:
// https://github.com/golang/go/commit/2ffb3e5d905b5622204d199128dec06cefd57790 // https://github.com/golang/go/commit/2ffb3e5d905b5622204d199128dec06cefd57790
if setting.IsWindows { // Note: Windows complains when delete target does not exist, therefore we can skip deletion in such cases.
if setting.IsWindows && com.IsExist(path) {
// converting "/" to "\" in path on Windows // converting "/" to "\" in path on Windows
path = strings.Replace(path, "/", "\\", -1) path = strings.Replace(path, "/", "\\", -1)
err = exec.Command("cmd", "/C", "rmdir", "/S", "/Q", path).Run() err = exec.Command("cmd", "/C", "rmdir", "/S", "/Q", path).Run()

172
models/issue.go

@ -98,9 +98,8 @@ func (issue *Issue) loadAttributes(e Engine) (err error) {
issue.PosterID = -1 issue.PosterID = -1
issue.Poster = NewGhostUser() issue.Poster = NewGhostUser()
} else { } else {
return fmt.Errorf("getUserByID.(poster) [%d]: %v", issue.PosterID, err) return fmt.Errorf("getUserByID.(Poster) [%d]: %v", issue.PosterID, err)
} }
return
} }
} }
@ -650,7 +649,7 @@ func newIssue(e *xorm.Session, opts NewIssueOptions) (err error) {
} }
if len(opts.LableIDs) > 0 { if len(opts.LableIDs) > 0 {
// During the session, SQLite3 dirver cannot handle retrieve objects after update something. // During the session, SQLite3 driver cannot handle retrieve objects after update something.
// So we have to get all needed labels first. // So we have to get all needed labels first.
labels := make([]*Label, 0, len(opts.LableIDs)) labels := make([]*Label, 0, len(opts.LableIDs))
if err = e.In("id", opts.LableIDs).Find(&labels); err != nil { if err = e.In("id", opts.LableIDs).Find(&labels); err != nil {
@ -780,7 +779,7 @@ func GetIssueByIndex(repoID, index int64) (*Issue, error) {
return issue, issue.LoadAttributes() return issue, issue.LoadAttributes()
} }
func getIssueByID(e Engine, id int64) (*Issue, error) { func getRawIssueByID(e Engine, id int64) (*Issue, error) {
issue := new(Issue) issue := new(Issue)
has, err := e.Id(id).Get(issue) has, err := e.Id(id).Get(issue)
if err != nil { if err != nil {
@ -788,7 +787,15 @@ func getIssueByID(e Engine, id int64) (*Issue, error) {
} else if !has { } else if !has {
return nil, ErrIssueNotExist{id, 0, 0} return nil, ErrIssueNotExist{id, 0, 0}
} }
return issue, issue.LoadAttributes() return issue, nil
}
func getIssueByID(e Engine, id int64) (*Issue, error) {
issue, err := getRawIssueByID(e, id)
if err != nil {
return nil, err
}
return issue, issue.loadAttributes(e)
} }
// GetIssueByID returns an issue by given ID. // GetIssueByID returns an issue by given ID.
@ -997,17 +1004,17 @@ func GetIssueUserPairsByRepoIds(rids []int64, isClosed bool, page int) ([]*Issue
} }
// GetIssueUserPairsByMode returns issue-user pairs by given repository and user. // GetIssueUserPairsByMode returns issue-user pairs by given repository and user.
func GetIssueUserPairsByMode(uid, rid int64, isClosed bool, page, filterMode int) ([]*IssueUser, error) { func GetIssueUserPairsByMode(userID, repoID int64, filterMode FilterMode, isClosed bool, page int) ([]*IssueUser, error) {
ius := make([]*IssueUser, 0, 10) ius := make([]*IssueUser, 0, 10)
sess := x.Limit(20, (page-1)*20).Where("uid=?", uid).And("is_closed=?", isClosed) sess := x.Limit(20, (page-1)*20).Where("uid=?", userID).And("is_closed=?", isClosed)
if rid > 0 { if repoID > 0 {
sess.And("repo_id=?", rid) sess.And("repo_id=?", repoID)
} }
switch filterMode { switch filterMode {
case FM_ASSIGN: case FILTER_MODE_ASSIGN:
sess.And("is_assigned=?", true) sess.And("is_assigned=?", true)
case FM_CREATE: case FILTER_MODE_CREATE:
sess.And("is_poster=?", true) sess.And("is_poster=?", true)
default: default:
return ius, nil return ius, nil
@ -1016,9 +1023,9 @@ func GetIssueUserPairsByMode(uid, rid int64, isClosed bool, page, filterMode int
return ius, err return ius, err
} }
// UpdateIssueMentions extracts mentioned people from content and // updateIssueMentions extracts mentioned people from content and
// updates issue-user relations for them. // updates issue-user relations for them.
func UpdateIssueMentions(issueID int64, mentions []string) error { func updateIssueMentions(e Engine, issueID int64, mentions []string) error {
if len(mentions) == 0 { if len(mentions) == 0 {
return nil return nil
} }
@ -1028,7 +1035,7 @@ func UpdateIssueMentions(issueID int64, mentions []string) error {
} }
users := make([]*User, 0, len(mentions)) users := make([]*User, 0, len(mentions))
if err := x.In("lower_name", mentions).Asc("lower_name").Find(&users); err != nil { if err := e.In("lower_name", mentions).Asc("lower_name").Find(&users); err != nil {
return fmt.Errorf("find mentioned users: %v", err) return fmt.Errorf("find mentioned users: %v", err)
} }
@ -1040,9 +1047,9 @@ func UpdateIssueMentions(issueID int64, mentions []string) error {
} }
memberIDs := make([]int64, 0, user.NumMembers) memberIDs := make([]int64, 0, user.NumMembers)
orgUsers, err := GetOrgUsersByOrgID(user.ID) orgUsers, err := getOrgUsersByOrgID(e, user.ID)
if err != nil { if err != nil {
return fmt.Errorf("GetOrgUsersByOrgID [%d]: %v", user.ID, err) return fmt.Errorf("getOrgUsersByOrgID [%d]: %v", user.ID, err)
} }
for _, orgUser := range orgUsers { for _, orgUser := range orgUsers {
@ -1052,7 +1059,7 @@ func UpdateIssueMentions(issueID int64, mentions []string) error {
ids = append(ids, memberIDs...) ids = append(ids, memberIDs...)
} }
if err := UpdateIssueUsersByMentions(issueID, ids); err != nil { if err := updateIssueUsersByMentions(e, issueID, ids); err != nil {
return fmt.Errorf("UpdateIssueUsersByMentions: %v", err) return fmt.Errorf("UpdateIssueUsersByMentions: %v", err)
} }
@ -1062,18 +1069,19 @@ func UpdateIssueMentions(issueID int64, mentions []string) error {
// IssueStats represents issue statistic information. // IssueStats represents issue statistic information.
type IssueStats struct { type IssueStats struct {
OpenCount, ClosedCount int64 OpenCount, ClosedCount int64
AllCount int64 YourReposCount int64
AssignCount int64 AssignCount int64
CreateCount int64 CreateCount int64
MentionCount int64 MentionCount int64
} }
// Filter modes. type FilterMode string
const ( const (
FM_ALL = iota FILTER_MODE_YOUR_REPOS FilterMode = "your_repositories"
FM_ASSIGN FILTER_MODE_ASSIGN FilterMode = "assigned"
FM_CREATE FILTER_MODE_CREATE FilterMode = "created_by"
FM_MENTION FILTER_MODE_MENTION FilterMode = "mentioned"
) )
func parseCountResult(results []map[string][]byte) int64 { func parseCountResult(results []map[string][]byte) int64 {
@ -1092,7 +1100,7 @@ type IssueStatsOptions struct {
Labels string Labels string
MilestoneID int64 MilestoneID int64
AssigneeID int64 AssigneeID int64
FilterMode int FilterMode FilterMode
IsPull bool IsPull bool
} }
@ -1122,86 +1130,102 @@ func GetIssueStats(opts *IssueStatsOptions) *IssueStats {
} }
switch opts.FilterMode { switch opts.FilterMode {
case FM_ALL, FM_ASSIGN: case FILTER_MODE_YOUR_REPOS, FILTER_MODE_ASSIGN:
stats.OpenCount, _ = countSession(opts). stats.OpenCount, _ = countSession(opts).
And("is_closed = ?", false). And("is_closed = ?", false).
Count(&Issue{}) Count(new(Issue))
stats.ClosedCount, _ = countSession(opts). stats.ClosedCount, _ = countSession(opts).
And("is_closed = ?", true). And("is_closed = ?", true).
Count(&Issue{}) Count(new(Issue))
case FM_CREATE: case FILTER_MODE_CREATE:
stats.OpenCount, _ = countSession(opts). stats.OpenCount, _ = countSession(opts).
And("poster_id = ?", opts.UserID). And("poster_id = ?", opts.UserID).
And("is_closed = ?", false). And("is_closed = ?", false).
Count(&Issue{}) Count(new(Issue))
stats.ClosedCount, _ = countSession(opts). stats.ClosedCount, _ = countSession(opts).
And("poster_id = ?", opts.UserID). And("poster_id = ?", opts.UserID).
And("is_closed = ?", true). And("is_closed = ?", true).
Count(&Issue{}) Count(new(Issue))
case FM_MENTION: case FILTER_MODE_MENTION:
stats.OpenCount, _ = countSession(opts). stats.OpenCount, _ = countSession(opts).
Join("INNER", "issue_user", "issue.id = issue_user.issue_id"). Join("INNER", "issue_user", "issue.id = issue_user.issue_id").
And("issue_user.uid = ?", opts.UserID). And("issue_user.uid = ?", opts.UserID).
And("issue_user.is_mentioned = ?", true). And("issue_user.is_mentioned = ?", true).
And("issue.is_closed = ?", false). And("issue.is_closed = ?", false).
Count(&Issue{}) Count(new(Issue))
stats.ClosedCount, _ = countSession(opts). stats.ClosedCount, _ = countSession(opts).
Join("INNER", "issue_user", "issue.id = issue_user.issue_id"). Join("INNER", "issue_user", "issue.id = issue_user.issue_id").
And("issue_user.uid = ?", opts.UserID). And("issue_user.uid = ?", opts.UserID).
And("issue_user.is_mentioned = ?", true). And("issue_user.is_mentioned = ?", true).
And("issue.is_closed = ?", true). And("issue.is_closed = ?", true).
Count(&Issue{}) Count(new(Issue))
} }
return stats return stats
} }
// GetUserIssueStats returns issue statistic information for dashboard by given conditions. // GetUserIssueStats returns issue statistic information for dashboard by given conditions.
func GetUserIssueStats(repoID, uid int64, repoIDs []int64, filterMode int, isPull bool) *IssueStats { func GetUserIssueStats(repoID, userID int64, repoIDs []int64, filterMode FilterMode, isPull bool) *IssueStats {
stats := &IssueStats{} stats := &IssueStats{}
hasAnyRepo := repoID > 0 || len(repoIDs) > 0
countSession := func(isClosed, isPull bool, repoID int64, repoIDs []int64) *xorm.Session { countSession := func(isClosed, isPull bool, repoID int64, repoIDs []int64) *xorm.Session {
sess := x.Where("issue.is_closed = ?", isClosed).And("issue.is_pull = ?", isPull) sess := x.Where("issue.is_closed = ?", isClosed).And("issue.is_pull = ?", isPull)
if repoID > 0 || len(repoIDs) == 0 { if repoID > 0 {
sess.And("repo_id = ?", repoID) sess.And("repo_id = ?", repoID)
} else { } else if len(repoIDs) > 0 {
sess.In("repo_id", repoIDs) sess.In("repo_id", repoIDs)
} }
return sess return sess
} }
stats.AssignCount, _ = countSession(false, isPull, repoID, repoIDs). stats.AssignCount, _ = countSession(false, isPull, repoID, nil).
And("assignee_id = ?", uid). And("assignee_id = ?", userID).
Count(&Issue{}) Count(new(Issue))
stats.CreateCount, _ = countSession(false, isPull, repoID, repoIDs). stats.CreateCount, _ = countSession(false, isPull, repoID, nil).
And("poster_id = ?", uid). And("poster_id = ?", userID).
Count(&Issue{}) Count(new(Issue))
openCountSession := countSession(false, isPull, repoID, repoIDs) if hasAnyRepo {
closedCountSession := countSession(true, isPull, repoID, repoIDs) stats.YourReposCount, _ = countSession(false, isPull, repoID, repoIDs).
Count(new(Issue))
}
switch filterMode { switch filterMode {
case FM_ASSIGN: case FILTER_MODE_YOUR_REPOS:
openCountSession.And("assignee_id = ?", uid) if !hasAnyRepo {
closedCountSession.And("assignee_id = ?", uid) break
case FM_CREATE: }
openCountSession.And("poster_id = ?", uid)
closedCountSession.And("poster_id = ?", uid) stats.OpenCount, _ = countSession(false, isPull, repoID, repoIDs).
Count(new(Issue))
stats.ClosedCount, _ = countSession(true, isPull, repoID, repoIDs).
Count(new(Issue))
case FILTER_MODE_ASSIGN:
stats.OpenCount, _ = countSession(false, isPull, repoID, nil).
And("assignee_id = ?", userID).
Count(new(Issue))
stats.ClosedCount, _ = countSession(true, isPull, repoID, nil).
And("assignee_id = ?", userID).
Count(new(Issue))
case FILTER_MODE_CREATE:
stats.OpenCount, _ = countSession(false, isPull, repoID, nil).
And("poster_id = ?", userID).
Count(new(Issue))
stats.ClosedCount, _ = countSession(true, isPull, repoID, nil).
And("poster_id = ?", userID).
Count(new(Issue))
} }
stats.OpenCount, _ = openCountSession.Count(&Issue{})
stats.ClosedCount, _ = closedCountSession.Count(&Issue{})
return stats return stats
} }
// GetRepoIssueStats returns number of open and closed repository issues by given filter mode. // GetRepoIssueStats returns number of open and closed repository issues by given filter mode.
func GetRepoIssueStats(repoID, uid int64, filterMode int, isPull bool) (numOpen int64, numClosed int64) { func GetRepoIssueStats(repoID, userID int64, filterMode FilterMode, isPull bool) (numOpen int64, numClosed int64) {
countSession := func(isClosed, isPull bool, repoID int64) *xorm.Session { countSession := func(isClosed, isPull bool, repoID int64) *xorm.Session {
sess := x.Where("issue.repo_id = ?", isClosed). sess := x.Where("issue.repo_id = ?", isClosed).
And("is_pull = ?", isPull). And("is_pull = ?", isPull).
@ -1214,16 +1238,16 @@ func GetRepoIssueStats(repoID, uid int64, filterMode int, isPull bool) (numOpen
closedCountSession := countSession(true, isPull, repoID) closedCountSession := countSession(true, isPull, repoID)
switch filterMode { switch filterMode {
case FM_ASSIGN: case FILTER_MODE_ASSIGN:
openCountSession.And("assignee_id = ?", uid) openCountSession.And("assignee_id = ?", userID)
closedCountSession.And("assignee_id = ?", uid) closedCountSession.And("assignee_id = ?", userID)
case FM_CREATE: case FILTER_MODE_CREATE:
openCountSession.And("poster_id = ?", uid) openCountSession.And("poster_id = ?", userID)
closedCountSession.And("poster_id = ?", uid) closedCountSession.And("poster_id = ?", userID)
} }
openResult, _ := openCountSession.Count(&Issue{}) openResult, _ := openCountSession.Count(new(Issue))
closedResult, _ := closedCountSession.Count(&Issue{}) closedResult, _ := closedCountSession.Count(new(Issue))
return openResult, closedResult return openResult, closedResult
} }
@ -1284,23 +1308,23 @@ func UpdateIssueUserByRead(uid, issueID int64) error {
return err return err
} }
// UpdateIssueUsersByMentions updates issue-user pairs by mentioning. // updateIssueUsersByMentions updates issue-user pairs by mentioning.
func UpdateIssueUsersByMentions(issueID int64, uids []int64) error { func updateIssueUsersByMentions(e Engine, issueID int64, uids []int64) error {
for _, uid := range uids { for _, uid := range uids {
iu := &IssueUser{ iu := &IssueUser{
UID: uid, UID: uid,
IssueID: issueID, IssueID: issueID,
} }
has, err := x.Get(iu) has, err := e.Get(iu)
if err != nil { if err != nil {
return err return err
} }
iu.IsMentioned = true iu.IsMentioned = true
if has { if has {
_, err = x.Id(iu.ID).AllCols().Update(iu) _, err = e.Id(iu.ID).AllCols().Update(iu)
} else { } else {
_, err = x.Insert(iu) _, err = e.Insert(iu)
} }
if err != nil { if err != nil {
return err return err
@ -1605,8 +1629,8 @@ func ChangeMilestoneAssign(issue *Issue, oldMilestoneID int64) (err error) {
return sess.Commit() return sess.Commit()
} }
// DeleteMilestoneByRepoID deletes a milestone from a repository. // DeleteMilestoneOfRepoByID deletes a milestone from a repository.
func DeleteMilestoneByRepoID(repoID, id int64) error { func DeleteMilestoneOfRepoByID(repoID, id int64) error {
m, err := GetMilestoneByRepoID(repoID, id) m, err := GetMilestoneByRepoID(repoID, id)
if err != nil { if err != nil {
if IsErrMilestoneNotExist(err) { if IsErrMilestoneNotExist(err) {
@ -1745,10 +1769,14 @@ func GetAttachmentsByIssueID(issueID int64) ([]*Attachment, error) {
return getAttachmentsByIssueID(x, issueID) return getAttachmentsByIssueID(x, issueID)
} }
func getAttachmentsByCommentID(e Engine, commentID int64) ([]*Attachment, error) {
attachments := make([]*Attachment, 0, 10)
return attachments, e.Where("comment_id=?", commentID).Find(&attachments)
}
// GetAttachmentsByCommentID returns all attachments if comment by given ID. // GetAttachmentsByCommentID returns all attachments if comment by given ID.
func GetAttachmentsByCommentID(commentID int64) ([]*Attachment, error) { func GetAttachmentsByCommentID(commentID int64) ([]*Attachment, error) {
attachments := make([]*Attachment, 0, 10) return getAttachmentsByCommentID(x, commentID)
return attachments, x.Where("comment_id=?", commentID).Find(&attachments)
} }
// DeleteAttachment deletes the given attachment and optionally the associated file. // DeleteAttachment deletes the given attachment and optionally the associated file.

97
models/issue_comment.go

@ -53,6 +53,7 @@ type Comment struct {
PosterID int64 PosterID int64
Poster *User `xorm:"-"` Poster *User `xorm:"-"`
IssueID int64 `xorm:"INDEX"` IssueID int64 `xorm:"INDEX"`
Issue *Issue `xorm:"-"`
CommitID int64 CommitID int64
Line int64 Line int64
Content string `xorm:"TEXT"` Content string `xorm:"TEXT"`
@ -82,29 +83,46 @@ func (c *Comment) BeforeUpdate() {
} }
func (c *Comment) AfterSet(colName string, _ xorm.Cell) { func (c *Comment) AfterSet(colName string, _ xorm.Cell) {
var err error
switch colName { switch colName {
case "id": case "created_unix":
c.Attachments, err = GetAttachmentsByCommentID(c.ID) c.Created = time.Unix(c.CreatedUnix, 0).Local()
if err != nil { case "updated_unix":
log.Error(3, "GetAttachmentsByCommentID[%d]: %v", c.ID, err) c.Updated = time.Unix(c.UpdatedUnix, 0).Local()
} }
}
case "poster_id": func (c *Comment) loadAttributes(e Engine) (err error) {
if c.Poster == nil {
c.Poster, err = GetUserByID(c.PosterID) c.Poster, err = GetUserByID(c.PosterID)
if err != nil { if err != nil {
if IsErrUserNotExist(err) { if IsErrUserNotExist(err) {
c.PosterID = -1 c.PosterID = -1
c.Poster = NewGhostUser() c.Poster = NewGhostUser()
} else { } else {
log.Error(3, "GetUserByID[%d]: %v", c.ID, err) return fmt.Errorf("getUserByID.(Poster) [%d]: %v", c.PosterID, err)
} }
} }
case "created_unix":
c.Created = time.Unix(c.CreatedUnix, 0).Local()
case "updated_unix":
c.Updated = time.Unix(c.UpdatedUnix, 0).Local()
} }
if c.Issue == nil {
c.Issue, err = getRawIssueByID(e, c.IssueID)
if err != nil {
return fmt.Errorf("getIssueByID [%d]: %v", c.IssueID, err)
}
}
if c.Attachments == nil {
c.Attachments, err = getAttachmentsByCommentID(e, c.ID)
if err != nil {
return fmt.Errorf("getAttachmentsByCommentID [%d]: %v", c.ID, err)
}
}
return nil
}
func (c *Comment) LoadAttributes() error {
return c.loadAttributes(x)
} }
func (c *Comment) AfterDelete() { func (c *Comment) AfterDelete() {
@ -115,9 +133,16 @@ func (c *Comment) AfterDelete() {
} }
} }
func (c *Comment) HTMLURL() string {
return fmt.Sprintf("%s#issuecomment-%d", c.Issue.HTMLURL(), c.ID)
}
// This method assumes following fields have been assigned with valid values:
// Required - Poster, Issue
func (c *Comment) APIFormat() *api.Comment { func (c *Comment) APIFormat() *api.Comment {
return &api.Comment{ return &api.Comment{
ID: c.ID, ID: c.ID,
HTMLURL: c.HTMLURL(),
Poster: c.Poster.APIFormat(), Poster: c.Poster.APIFormat(),
Body: c.Content, Body: c.Content,
Created: c.Created, Created: c.Created,
@ -135,11 +160,11 @@ func (c *Comment) EventTag() string {
return "event-" + com.ToStr(c.ID) return "event-" + com.ToStr(c.ID)
} }
// MailParticipants sends new comment emails to repository watchers // mailParticipants sends new comment emails to repository watchers
// and mentioned people. // and mentioned people.
func (cmt *Comment) MailParticipants(opType ActionType, issue *Issue) (err error) { func (cmt *Comment) mailParticipants(e Engine, opType ActionType, issue *Issue) (err error) {
mentions := markdown.FindAllMentions(cmt.Content) mentions := markdown.FindAllMentions(cmt.Content)
if err = UpdateIssueMentions(cmt.IssueID, mentions); err != nil { if err = updateIssueMentions(e, cmt.IssueID, mentions); err != nil {
return fmt.Errorf("UpdateIssueMentions [%d]: %v", cmt.IssueID, err) return fmt.Errorf("UpdateIssueMentions [%d]: %v", cmt.IssueID, err)
} }
@ -253,10 +278,12 @@ func createComment(e *xorm.Session, opts *CreateCommentOptions) (_ *Comment, err
if err = notifyWatchers(e, act); err != nil { if err = notifyWatchers(e, act); err != nil {
log.Error(4, "notifyWatchers: %v", err) log.Error(4, "notifyWatchers: %v", err)
} }
comment.MailParticipants(act.OpType, opts.Issue) if err = comment.mailParticipants(e, act.OpType, opts.Issue); err != nil {
log.Error(4, "MailParticipants: %v", err)
}
} }
return comment, nil return comment, comment.loadAttributes(e)
} }
func createStatusComment(e *xorm.Session, doer *User, repo *Repository, issue *Issue) (*Comment, error) { func createStatusComment(e *xorm.Session, doer *User, repo *Repository, issue *Issue) (*Comment, error) {
@ -351,7 +378,18 @@ func GetCommentByID(id int64) (*Comment, error) {
} else if !has { } else if !has {
return nil, ErrCommentNotExist{id, 0} return nil, ErrCommentNotExist{id, 0}
} }
return c, nil return c, c.LoadAttributes()
}
// FIXME: use CommentList to improve performance.
func loadCommentsAttributes(e Engine, comments []*Comment) (err error) {
for i := range comments {
if err = comments[i].loadAttributes(e); err != nil {
return fmt.Errorf("loadAttributes [%d]: %v", comments[i].ID, err)
}
}
return nil
} }
func getCommentsByIssueIDSince(e Engine, issueID, since int64) ([]*Comment, error) { func getCommentsByIssueIDSince(e Engine, issueID, since int64) ([]*Comment, error) {
@ -360,7 +398,23 @@ func getCommentsByIssueIDSince(e Engine, issueID, since int64) ([]*Comment, erro
if since > 0 { if since > 0 {
sess.And("updated_unix >= ?", since) sess.And("updated_unix >= ?", since)
} }
return comments, sess.Find(&comments)
if err := sess.Find(&comments); err != nil {
return nil, err
}
return comments, loadCommentsAttributes(e, comments)
}
func getCommentsByRepoIDSince(e Engine, repoID, since int64) ([]*Comment, error) {
comments := make([]*Comment, 0, 10)
sess := e.Where("issue.repo_id = ?", repoID).Join("INNER", "issue", "issue.id = comment.issue_id", repoID).Asc("created_unix")
if since > 0 {
sess.And("updated_unix >= ?", since)
}
if err := sess.Find(&comments); err != nil {
return nil, err
}
return comments, loadCommentsAttributes(e, comments)
} }
func getCommentsByIssueID(e Engine, issueID int64) ([]*Comment, error) { func getCommentsByIssueID(e Engine, issueID int64) ([]*Comment, error) {
@ -372,11 +426,16 @@ func GetCommentsByIssueID(issueID int64) ([]*Comment, error) {
return getCommentsByIssueID(x, issueID) return getCommentsByIssueID(x, issueID)
} }
// GetCommentsByIssueID returns a list of comments of an issue since a given time point. // GetCommentsByIssueIDSince returns a list of comments of an issue since a given time point.
func GetCommentsByIssueIDSince(issueID, since int64) ([]*Comment, error) { func GetCommentsByIssueIDSince(issueID, since int64) ([]*Comment, error) {
return getCommentsByIssueIDSince(x, issueID, since) return getCommentsByIssueIDSince(x, issueID, since)
} }
// GetCommentsByRepoIDSince returns a list of comments for all issues in a repo since a given time point.
func GetCommentsByRepoIDSince(repoID, since int64) ([]*Comment, error) {
return getCommentsByRepoIDSince(x, repoID, since)
}
// UpdateComment updates information of comment. // UpdateComment updates information of comment.
func UpdateComment(c *Comment) error { func UpdateComment(c *Comment) error {
_, err := x.Id(c.ID).AllCols().Update(c) _, err := x.Id(c.ID).AllCols().Update(c)

23
models/issue_label.go

@ -103,10 +103,10 @@ func NewLabels(labels ...*Label) error {
return err return err
} }
// getLabelInRepoByName returns a label by Name in given repository. // getLabelOfRepoByName returns a label by Name in given repository.
// If pass repoID as 0, then ORM will ignore limitation of repository // If pass repoID as 0, then ORM will ignore limitation of repository
// and can return arbitrary label with any valid ID. // and can return arbitrary label with any valid ID.
func getLabelInRepoByName(e Engine, repoID int64, labelName string) (*Label, error) { func getLabelOfRepoByName(e Engine, repoID int64, labelName string) (*Label, error) {
if len(labelName) <= 0 { if len(labelName) <= 0 {
return nil, ErrLabelNotExist{0, repoID} return nil, ErrLabelNotExist{0, repoID}
} }
@ -124,10 +124,11 @@ func getLabelInRepoByName(e Engine, repoID int64, labelName string) (*Label, err
return l, nil return l, nil
} }
// getLabelInRepoByID returns a label by ID in given repository.
// getLabelOfRepoByID returns a label by ID in given repository.
// If pass repoID as 0, then ORM will ignore limitation of repository // If pass repoID as 0, then ORM will ignore limitation of repository
// and can return arbitrary label with any valid ID. // and can return arbitrary label with any valid ID.
func getLabelInRepoByID(e Engine, repoID, labelID int64) (*Label, error) { func getLabelOfRepoByID(e Engine, repoID, labelID int64) (*Label, error) {
if labelID <= 0 { if labelID <= 0 {
return nil, ErrLabelNotExist{labelID, repoID} return nil, ErrLabelNotExist{labelID, repoID}
} }
@ -147,17 +148,17 @@ func getLabelInRepoByID(e Engine, repoID, labelID int64) (*Label, error) {
// GetLabelByID returns a label by given ID. // GetLabelByID returns a label by given ID.
func GetLabelByID(id int64) (*Label, error) { func GetLabelByID(id int64) (*Label, error) {
return getLabelInRepoByID(x, 0, id) return getLabelOfRepoByID(x, 0, id)
} }
// GetLabelInRepoByID returns a label by ID in given repository. // GetLabelInRepoByID returns a label by ID in given repository.
func GetLabelInRepoByName(repoID int64, labelName string) (*Label, error) { func GetLabelOnRepoByName(repoID int64, labelName string) (*Label, error) {
return getLabelInRepoByName(x, repoID, labelName) return getLabelOnRepoByName(x, repoID, labelName)
} }
// GetLabelInRepoByID returns a label by ID in given repository. // GetLabelOfRepoByID returns a label by ID in given repository.
func GetLabelInRepoByID(repoID, labelID int64) (*Label, error) { func GetLabelOfRepoByID(repoID, labelID int64) (*Label, error) {
return getLabelInRepoByID(x, repoID, labelID) return getLabelOfRepoByID(x, repoID, labelID)
} }
// GetLabelsInRepoByIDs returns a list of labels by IDs in given repository, // GetLabelsInRepoByIDs returns a list of labels by IDs in given repository,
@ -207,7 +208,7 @@ func UpdateLabel(l *Label) error {
// DeleteLabel delete a label of given repository. // DeleteLabel delete a label of given repository.
func DeleteLabel(repoID, labelID int64) error { func DeleteLabel(repoID, labelID int64) error {
_, err := GetLabelInRepoByID(repoID, labelID) _, err := GetLabelOfRepoByID(repoID, labelID)
if err != nil { if err != nil {
if IsErrLabelNotExist(err) { if IsErrLabelNotExist(err) {
return nil return nil

78
models/issue_mail.go

@ -10,6 +10,7 @@ import (
"github.com/Unknwon/com" "github.com/Unknwon/com"
"github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/mailer"
"github.com/gogits/gogs/modules/markdown" "github.com/gogits/gogs/modules/markdown"
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
) )
@ -18,6 +19,77 @@ func (issue *Issue) MailSubject() string {
return fmt.Sprintf("[%s] %s (#%d)", issue.Repo.Name, issue.Title, issue.Index) return fmt.Sprintf("[%s] %s (#%d)", issue.Repo.Name, issue.Title, issue.Index)
} }
// mailerUser is a wrapper for satisfying mailer.User interface.
type mailerUser struct {
user *User
}
func (this mailerUser) ID() int64 {
return this.user.ID
}
func (this mailerUser) DisplayName() string {
return this.user.DisplayName()
}
func (this mailerUser) Email() string {
return this.user.Email
}
func (this mailerUser) GenerateActivateCode() string {
return this.user.GenerateActivateCode()
}
func (this mailerUser) GenerateEmailActivateCode(email string) string {
return this.user.GenerateEmailActivateCode(email)
}
func NewMailerUser(u *User) mailer.User {
return mailerUser{u}
}
// mailerRepo is a wrapper for satisfying mailer.Repository interface.
type mailerRepo struct {
repo *Repository
}
func (this mailerRepo) FullName() string {
return this.repo.FullName()
}
func (this mailerRepo) HTMLURL() string {
return this.repo.HTMLURL()
}
func (this mailerRepo) ComposeMetas() map[string]string {
return this.repo.ComposeMetas()
}
func NewMailerRepo(repo *Repository) mailer.Repository {
return mailerRepo{repo}
}
// mailerIssue is a wrapper for satisfying mailer.Issue interface.
type mailerIssue struct {
issue *Issue
}
func (this mailerIssue) MailSubject() string {
return this.issue.MailSubject()
}
func (this mailerIssue) Content() string {
return this.issue.Content
}
func (this mailerIssue) HTMLURL() string {
return this.issue.HTMLURL()
}
func NewMailerIssue(issue *Issue) mailer.Issue {
return mailerIssue{issue}
}
// mailIssueCommentToParticipants can be used for both new issue creation and comment. // mailIssueCommentToParticipants can be used for both new issue creation and comment.
func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string) error { func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string) error {
if !setting.Service.EnableNotifyMail { if !setting.Service.EnableNotifyMail {
@ -48,7 +120,7 @@ func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string)
tos = append(tos, to.Email) tos = append(tos, to.Email)
names = append(names, to.Name) names = append(names, to.Name)
} }
SendIssueCommentMail(issue, doer, tos) mailer.SendIssueCommentMail(NewMailerIssue(issue), NewMailerRepo(issue.Repo), NewMailerUser(doer), tos)
// Mail mentioned people and exclude watchers. // Mail mentioned people and exclude watchers.
names = append(names, doer.Name) names = append(names, doer.Name)
@ -60,7 +132,7 @@ func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string)
tos = append(tos, mentions[i]) tos = append(tos, mentions[i])
} }
SendIssueMentionMail(issue, doer, GetUserEmailsByNames(tos)) mailer.SendIssueMentionMail(NewMailerIssue(issue), NewMailerRepo(issue.Repo), NewMailerUser(doer), GetUserEmailsByNames(tos))
return nil return nil
} }
@ -69,7 +141,7 @@ func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string)
// and mentioned people. // and mentioned people.
func (issue *Issue) MailParticipants() (err error) { func (issue *Issue) MailParticipants() (err error) {
mentions := markdown.FindAllMentions(issue.Content) mentions := markdown.FindAllMentions(issue.Content)
if err = UpdateIssueMentions(issue.ID, mentions); err != nil { if err = updateIssueMentions(x, issue.ID, mentions); err != nil {
return fmt.Errorf("UpdateIssueMentions [%d]: %v", issue.ID, err) return fmt.Errorf("UpdateIssueMentions [%d]: %v", issue.ID, err)
} }

12
models/login_source.go

@ -292,8 +292,8 @@ func composeFullName(firstname, surname, username string) string {
// LoginViaLDAP queries if login/password is valid against the LDAP directory pool, // LoginViaLDAP queries if login/password is valid against the LDAP directory pool,
// and create a local user if success when enabled. // and create a local user if success when enabled.
func LoginViaLDAP(user *User, login, passowrd string, source *LoginSource, autoRegister bool) (*User, error) { func LoginViaLDAP(user *User, login, password string, source *LoginSource, autoRegister bool) (*User, error) {
username, fn, sn, mail, isAdmin, succeed := source.Cfg.(*LDAPConfig).SearchEntry(login, passowrd, source.Type == LOGIN_DLDAP) username, fn, sn, mail, isAdmin, succeed := source.Cfg.(*LDAPConfig).SearchEntry(login, password, source.Type == LOGIN_DLDAP)
if !succeed { if !succeed {
// User not in LDAP, do nothing // User not in LDAP, do nothing
return nil, ErrUserNotExist{0, login} return nil, ErrUserNotExist{0, login}
@ -505,7 +505,7 @@ func ExternalUserLogin(user *User, login, password string, source *LoginSource,
} }
// UserSignIn validates user name and password. // UserSignIn validates user name and password.
func UserSignIn(username, passowrd string) (*User, error) { func UserSignIn(username, password string) (*User, error) {
var user *User var user *User
if strings.Contains(username, "@") { if strings.Contains(username, "@") {
user = &User{Email: strings.ToLower(username)} user = &User{Email: strings.ToLower(username)}
@ -521,7 +521,7 @@ func UserSignIn(username, passowrd string) (*User, error) {
if hasUser { if hasUser {
switch user.LoginType { switch user.LoginType {
case LOGIN_NOTYPE, LOGIN_PLAIN: case LOGIN_NOTYPE, LOGIN_PLAIN:
if user.ValidatePassword(passowrd) { if user.ValidatePassword(password) {
return user, nil return user, nil
} }
@ -536,7 +536,7 @@ func UserSignIn(username, passowrd string) (*User, error) {
return nil, ErrLoginSourceNotExist{user.LoginSource} return nil, ErrLoginSourceNotExist{user.LoginSource}
} }
return ExternalUserLogin(user, user.LoginName, passowrd, &source, false) return ExternalUserLogin(user, user.LoginName, password, &source, false)
} }
} }
@ -546,7 +546,7 @@ func UserSignIn(username, passowrd string) (*User, error) {
} }
for _, source := range sources { for _, source := range sources {
authUser, err := ExternalUserLogin(nil, username, passowrd, source, true) authUser, err := ExternalUserLogin(nil, username, password, source, true)
if err == nil { if err == nil {
return authUser, nil return authUser, nil
} }

8
models/migrations/migrations.go

@ -451,8 +451,12 @@ func generateOrgRandsAndSalt(x *xorm.Engine) (err error) {
} }
for _, org := range orgs { for _, org := range orgs {
org.Rands = base.GetRandomString(10) if org.Rands, err = base.GetRandomString(10); err != nil {
org.Salt = base.GetRandomString(10) return err
}
if org.Salt, err = base.GetRandomString(10); err != nil {
return err
}
if _, err = sess.Id(org.ID).Update(org); err != nil { if _, err = sess.Id(org.ID).Update(org); err != nil {
return err return err
} }

1
models/models.go

@ -34,6 +34,7 @@ type Engine interface {
InsertOne(interface{}) (int64, error) InsertOne(interface{}) (int64, error)
Iterate(interface{}, xorm.IterFunc) error Iterate(interface{}, xorm.IterFunc) error
Sql(string, ...interface{}) *xorm.Session Sql(string, ...interface{}) *xorm.Session
Table(interface{}) *xorm.Session
Where(interface{}, ...interface{}) *xorm.Session Where(interface{}, ...interface{}) *xorm.Session
} }

19
models/org.go

@ -108,8 +108,12 @@ func CreateOrganization(org, owner *User) (err error) {
} }
org.LowerName = strings.ToLower(org.Name) org.LowerName = strings.ToLower(org.Name)
org.Rands = GetUserSalt() if org.Rands, err = GetUserSalt(); err != nil {
org.Salt = GetUserSalt() return err
}
if org.Salt, err = GetUserSalt(); err != nil {
return err
}
org.UseCustomAvatar = true org.UseCustomAvatar = true
org.MaxRepoCreation = -1 org.MaxRepoCreation = -1
org.NumTeams = 1 org.NumTeams = 1
@ -149,7 +153,7 @@ func CreateOrganization(org, owner *User) (err error) {
} }
if _, err = sess.Insert(&TeamUser{ if _, err = sess.Insert(&TeamUser{
Uid: owner.ID, UID: owner.ID,
OrgID: org.ID, OrgID: org.ID,
TeamID: t.ID, TeamID: t.ID,
}); err != nil { }); err != nil {
@ -307,11 +311,14 @@ func GetOrgUsersByUserID(uid int64, all bool) ([]*OrgUser, error) {
return ous, err return ous, err
} }
func getOrgUsersByOrgID(e Engine, orgID int64) ([]*OrgUser, error) {
orgUsers := make([]*OrgUser, 0, 10)
return orgUsers, e.Where("org_id=?", orgID).Find(&orgUsers)
}
// GetOrgUsersByOrgID returns all organization-user relations by organization ID. // GetOrgUsersByOrgID returns all organization-user relations by organization ID.
func GetOrgUsersByOrgID(orgID int64) ([]*OrgUser, error) { func GetOrgUsersByOrgID(orgID int64) ([]*OrgUser, error) {
ous := make([]*OrgUser, 0, 10) return getOrgUsersByOrgID(x, orgID)
err := x.Where("org_id=?", orgID).Find(&ous)
return ous, err
} }
// ChangeOrgUserStatus changes public or private membership status. // ChangeOrgUserStatus changes public or private membership status.

13
models/org_team.go

@ -369,7 +369,7 @@ type TeamUser struct {
ID int64 `xorm:"pk autoincr"` ID int64 `xorm:"pk autoincr"`
OrgID int64 `xorm:"INDEX"` OrgID int64 `xorm:"INDEX"`
TeamID int64 `xorm:"UNIQUE(s)"` TeamID int64 `xorm:"UNIQUE(s)"`
Uid int64 `xorm:"UNIQUE(s)"` UID int64 `xorm:"UNIQUE(s)"`
} }
func isTeamMember(e Engine, orgID, teamID, uid int64) bool { func isTeamMember(e Engine, orgID, teamID, uid int64) bool {
@ -384,14 +384,15 @@ func IsTeamMember(orgID, teamID, uid int64) bool {
func getTeamMembers(e Engine, teamID int64) (_ []*User, err error) { func getTeamMembers(e Engine, teamID int64) (_ []*User, err error) {
teamUsers := make([]*TeamUser, 0, 10) teamUsers := make([]*TeamUser, 0, 10)
if err = e.Where("team_id=?", teamID).Find(&teamUsers); err != nil { if err = e.Sql("SELECT `id`, `org_id`, `team_id`, `uid` FROM `team_user` WHERE team_id=?", teamID).
Find(&teamUsers); err != nil {
return nil, fmt.Errorf("get team-users: %v", err) return nil, fmt.Errorf("get team-users: %v", err)
} }
members := make([]*User, 0, len(teamUsers)) members := make([]*User, 0, len(teamUsers))
for i := range teamUsers { for i := range teamUsers {
member := new(User) member := new(User)
if _, err = e.Id(teamUsers[i].Uid).Get(member); err != nil { if _, err = e.Id(teamUsers[i].UID).Get(member); err != nil {
return nil, fmt.Errorf("get user '%d': %v", teamUsers[i].Uid, err) return nil, fmt.Errorf("get user '%d': %v", teamUsers[i].UID, err)
} }
members = append(members, member) members = append(members, member)
} }
@ -457,7 +458,7 @@ func AddTeamMember(orgID, teamID, uid int64) error {
} }
tu := &TeamUser{ tu := &TeamUser{
Uid: uid, UID: uid,
OrgID: orgID, OrgID: orgID,
TeamID: teamID, TeamID: teamID,
} }
@ -519,7 +520,7 @@ func removeTeamMember(e Engine, orgID, teamID, uid int64) error {
} }
tu := &TeamUser{ tu := &TeamUser{
Uid: uid, UID: uid,
OrgID: orgID, OrgID: orgID,
TeamID: teamID, TeamID: teamID,
} }

76
models/pull.go

@ -85,6 +85,20 @@ func (pr *PullRequest) AfterSet(colName string, _ xorm.Cell) {
// Note: don't try to get Issue because will end up recursive querying. // Note: don't try to get Issue because will end up recursive querying.
func (pr *PullRequest) loadAttributes(e Engine) (err error) { func (pr *PullRequest) loadAttributes(e Engine) (err error) {
if pr.HeadRepo == nil {
pr.HeadRepo, err = getRepositoryByID(e, pr.HeadRepoID)
if err != nil && !IsErrRepoNotExist(err) {
return fmt.Errorf("getRepositoryByID.(HeadRepo) [%d]: %v", pr.HeadRepoID, err)
}
}
if pr.BaseRepo == nil {
pr.BaseRepo, err = getRepositoryByID(e, pr.BaseRepoID)
if err != nil {
return fmt.Errorf("getRepositoryByID.(BaseRepo) [%d]: %v", pr.BaseRepoID, err)
}
}
if pr.HasMerged && pr.Merger == nil { if pr.HasMerged && pr.Merger == nil {
pr.Merger, err = getUserByID(e, pr.MergerID) pr.Merger, err = getUserByID(e, pr.MergerID)
if IsErrUserNotExist(err) { if IsErrUserNotExist(err) {
@ -112,9 +126,19 @@ func (pr *PullRequest) LoadIssue() (err error) {
} }
// This method assumes following fields have been assigned with valid values: // This method assumes following fields have been assigned with valid values:
// Required - Issue // Required - Issue, BaseRepo
// Optional - Merger // Optional - HeadRepo, Merger
func (pr *PullRequest) APIFormat() *api.PullRequest { func (pr *PullRequest) APIFormat() *api.PullRequest {
// In case of head repo has been deleted.
var apiHeadRepo *api.Repository
if pr.HeadRepo == nil {
apiHeadRepo = &api.Repository{
Name: "deleted",
}
} else {
apiHeadRepo = pr.HeadRepo.APIFormat(nil)
}
apiIssue := pr.Issue.APIFormat() apiIssue := pr.Issue.APIFormat()
apiPullRequest := &api.PullRequest{ apiPullRequest := &api.PullRequest{
ID: pr.ID, ID: pr.ID,
@ -127,6 +151,10 @@ func (pr *PullRequest) APIFormat() *api.PullRequest {
Assignee: apiIssue.Assignee, Assignee: apiIssue.Assignee,
State: apiIssue.State, State: apiIssue.State,
Comments: apiIssue.Comments, Comments: apiIssue.Comments,
HeadBranch: pr.HeadBranch,
HeadRepo: apiHeadRepo,
BaseBranch: pr.BaseBranch,
BaseRepo: pr.BaseRepo.APIFormat(nil),
HTMLURL: pr.Issue.HTMLURL(), HTMLURL: pr.Issue.HTMLURL(),
HasMerged: pr.HasMerged, HasMerged: pr.HasMerged,
} }
@ -144,30 +172,6 @@ func (pr *PullRequest) APIFormat() *api.PullRequest {
return apiPullRequest return apiPullRequest
} }
func (pr *PullRequest) getHeadRepo(e Engine) (err error) {
pr.HeadRepo, err = getRepositoryByID(e, pr.HeadRepoID)
if err != nil && !IsErrRepoNotExist(err) {
return fmt.Errorf("getRepositoryByID(head): %v", err)
}
return nil
}
func (pr *PullRequest) GetHeadRepo() error {
return pr.getHeadRepo(x)
}
func (pr *PullRequest) GetBaseRepo() (err error) {
if pr.BaseRepo != nil {
return nil
}
pr.BaseRepo, err = GetRepositoryByID(pr.BaseRepoID)
if err != nil {
return fmt.Errorf("GetRepositoryByID(base): %v", err)
}
return nil
}
// IsChecking returns true if this pull request is still checking conflict. // IsChecking returns true if this pull request is still checking conflict.
func (pr *PullRequest) IsChecking() bool { func (pr *PullRequest) IsChecking() bool {
return pr.Status == PULL_REQUEST_STATUS_CHECKING return pr.Status == PULL_REQUEST_STATUS_CHECKING
@ -181,12 +185,6 @@ func (pr *PullRequest) CanAutoMerge() bool {
// Merge merges pull request to base repository. // Merge merges pull request to base repository.
// FIXME: add repoWorkingPull make sure two merges does not happen at same time. // FIXME: add repoWorkingPull make sure two merges does not happen at same time.
func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error) { func (pr *PullRequest) Merge(doer *User, baseGitRepo *git.Repository) (err error) {
if err = pr.GetHeadRepo(); err != nil {
return fmt.Errorf("GetHeadRepo: %v", err)
} else if err = pr.GetBaseRepo(); err != nil {
return fmt.Errorf("GetBaseRepo: %v", err)
}
defer func() { defer func() {
go HookQueue.Add(pr.BaseRepo.ID) go HookQueue.Add(pr.BaseRepo.ID)
go AddTestPullRequestTask(doer, pr.BaseRepo.ID, pr.BaseBranch, false) go AddTestPullRequestTask(doer, pr.BaseRepo.ID, pr.BaseBranch, false)
@ -542,17 +540,11 @@ func (pr *PullRequest) UpdateCols(cols ...string) error {
// UpdatePatch generates and saves a new patch. // UpdatePatch generates and saves a new patch.
func (pr *PullRequest) UpdatePatch() (err error) { func (pr *PullRequest) UpdatePatch() (err error) {
if err = pr.GetHeadRepo(); err != nil { if pr.HeadRepo == nil {
return fmt.Errorf("GetHeadRepo: %v", err)
} else if pr.HeadRepo == nil {
log.Trace("PullRequest[%d].UpdatePatch: ignored cruppted data", pr.ID) log.Trace("PullRequest[%d].UpdatePatch: ignored cruppted data", pr.ID)
return nil return nil
} }
if err = pr.GetBaseRepo(); err != nil {
return fmt.Errorf("GetBaseRepo: %v", err)
}
headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath()) headGitRepo, err := git.OpenRepository(pr.HeadRepo.RepoPath())
if err != nil { if err != nil {
return fmt.Errorf("OpenRepository: %v", err) return fmt.Errorf("OpenRepository: %v", err)
@ -757,8 +749,8 @@ func TestPullRequests() {
func(idx int, bean interface{}) error { func(idx int, bean interface{}) error {
pr := bean.(*PullRequest) pr := bean.(*PullRequest)
if err := pr.GetBaseRepo(); err != nil { if err := pr.LoadAttributes(); err != nil {
log.Error(3, "GetBaseRepo: %v", err) log.Error(3, "LoadAttributes: %v", err)
return nil return nil
} }
@ -782,7 +774,7 @@ func TestPullRequests() {
pr, err := GetPullRequestByID(com.StrTo(prID).MustInt64()) pr, err := GetPullRequestByID(com.StrTo(prID).MustInt64())
if err != nil { if err != nil {
log.Error(4, "GetPullRequestByID[%d]: %v", prID, err) log.Error(4, "GetPullRequestByID[%s]: %v", prID, err)
continue continue
} else if err = pr.testPatch(); err != nil { } else if err = pr.testPatch(); err != nil {
log.Error(4, "testPatch[%d]: %v", pr.ID, err) log.Error(4, "testPatch[%d]: %v", pr.ID, err)

9
models/release.go

@ -178,13 +178,18 @@ func UpdateRelease(gitRepo *git.Repository, rel *Release) (err error) {
return err return err
} }
// DeleteReleaseByID deletes a release and corresponding Git tag by given ID. // DeleteReleaseOfRepoByID deletes a release and corresponding Git tag by given ID.
func DeleteReleaseByID(id int64) error { func DeleteReleaseOfRepoByID(repoID, id int64) error {
rel, err := GetReleaseByID(id) rel, err := GetReleaseByID(id)
if err != nil { if err != nil {
return fmt.Errorf("GetReleaseByID: %v", err) return fmt.Errorf("GetReleaseByID: %v", err)
} }
// Mark sure the delete operation againsts same repository.
if repoID != rel.RepoID {
return nil
}
repo, err := GetRepositoryByID(rel.RepoID) repo, err := GetRepositoryByID(rel.RepoID)
if err != nil { if err != nil {
return fmt.Errorf("GetRepositoryByID: %v", err) return fmt.Errorf("GetRepositoryByID: %v", err)

63
models/repo.go

@ -186,6 +186,7 @@ type Repository struct {
ExternalWikiURL string ExternalWikiURL string
EnableIssues bool `xorm:"NOT NULL DEFAULT true"` EnableIssues bool `xorm:"NOT NULL DEFAULT true"`
EnableExternalTracker bool EnableExternalTracker bool
ExternalTrackerURL string
ExternalTrackerFormat string ExternalTrackerFormat string
ExternalTrackerStyle string ExternalTrackerStyle string
ExternalMetas map[string]string `xorm:"-"` ExternalMetas map[string]string `xorm:"-"`
@ -376,8 +377,8 @@ func (repo *Repository) GetMilestoneByID(milestoneID int64) (*Milestone, error)
} }
// IssueStats returns number of open and closed repository issues by given filter mode. // IssueStats returns number of open and closed repository issues by given filter mode.
func (repo *Repository) IssueStats(uid int64, filterMode int, isPull bool) (int64, int64) { func (repo *Repository) IssueStats(userID int64, filterMode FilterMode, isPull bool) (int64, int64) {
return GetRepoIssueStats(repo.ID, uid, filterMode, isPull) return GetRepoIssueStats(repo.ID, userID, filterMode, isPull)
} }
func (repo *Repository) GetMirror() (err error) { func (repo *Repository) GetMirror() (err error) {
@ -482,6 +483,11 @@ func UpdateLocalCopyBranch(repoPath, localPath, branch string) error {
return fmt.Errorf("git clone %s: %v", branch, err) return fmt.Errorf("git clone %s: %v", branch, err)
} }
} else { } else {
if err := git.Fetch(localPath, git.FetchRemoteOptions{
Prune: true,
}); err != nil {
return fmt.Errorf("git fetch: %v", err)
}
if err := git.Checkout(localPath, git.CheckoutOptions{ if err := git.Checkout(localPath, git.CheckoutOptions{
Branch: branch, Branch: branch,
}); err != nil { }); err != nil {
@ -594,7 +600,9 @@ func wikiRemoteURL(remote string) string {
remote = strings.TrimSuffix(remote, ".git") remote = strings.TrimSuffix(remote, ".git")
for _, suffix := range commonWikiURLSuffixes { for _, suffix := range commonWikiURLSuffixes {
wikiURL := remote + suffix wikiURL := remote + suffix
if git.IsRepoURLAccessible(wikiURL) { if git.IsRepoURLAccessible(git.NetworkOptions{
URL: wikiURL,
}) {
return wikiURL return wikiURL
} }
} }
@ -1050,6 +1058,34 @@ func RepositoriesWithUsers(page, pageSize int) (_ []*Repository, err error) {
return repos, nil return repos, nil
} }
// FilterRepositoryWithIssues selects repositories that are using interal issue tracker
// and has disabled external tracker from given set.
// It returns nil if result set is empty.
func FilterRepositoryWithIssues(repoIDs []int64) ([]int64, error) {
if len(repoIDs) == 0 {
return nil, nil
}
repos := make([]*Repository, 0, len(repoIDs))
if err := x.Where("enable_issues=?", true).
And("enable_external_tracker=?", false).
In("id", repoIDs).
Cols("id").
Find(&repos); err != nil {
return nil, fmt.Errorf("filter valid repositories %v: %v", repoIDs, err)
}
if len(repos) == 0 {
return nil, nil
}
repoIDs = make([]int64, len(repos))
for i := range repos {
repoIDs[i] = repos[i].ID
}
return repoIDs, nil
}
// RepoPath returns repository path by given user and repository name. // RepoPath returns repository path by given user and repository name.
func RepoPath(userName, repoName string) string { func RepoPath(userName, repoName string) string {
return filepath.Join(UserPath(userName), strings.ToLower(repoName)+".git") return filepath.Join(UserPath(userName), strings.ToLower(repoName)+".git")
@ -1449,19 +1485,26 @@ func GetRepositoryByID(id int64) (*Repository, error) {
return getRepositoryByID(x, id) return getRepositoryByID(x, id)
} }
type UserRepoOptions struct {
UserID int64
Private bool
Page int
PageSize int
}
// GetUserRepositories returns a list of repositories of given user. // GetUserRepositories returns a list of repositories of given user.
func GetUserRepositories(userID int64, private bool, page, pageSize int) ([]*Repository, error) { func GetUserRepositories(opts *UserRepoOptions) ([]*Repository, error) {
sess := x.Where("owner_id = ?", userID).Desc("updated_unix") sess := x.Where("owner_id=?", opts.UserID).Desc("updated_unix")
if !private { if !opts.Private {
sess.And("is_private=?", false) sess.And("is_private=?", false)
} }
if page <= 0 { if opts.Page <= 0 {
page = 1 opts.Page = 1
} }
sess.Limit(pageSize, (page-1)*pageSize) sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize)
repos := make([]*Repository, 0, pageSize) repos := make([]*Repository, 0, opts.PageSize)
return repos, sess.Find(&repos) return repos, sess.Find(&repos)
} }

26
models/repo_mirror.go

@ -13,6 +13,8 @@ import (
"github.com/go-xorm/xorm" "github.com/go-xorm/xorm"
"gopkg.in/ini.v1" "gopkg.in/ini.v1"
"github.com/gogits/git-module"
"github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/process" "github.com/gogits/gogs/modules/process"
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
@ -104,6 +106,12 @@ func (m *Mirror) Address() string {
return HandleCloneUserCredentials(m.address, false) return HandleCloneUserCredentials(m.address, false)
} }
// MosaicsAddress returns mirror address from Git repository config with credentials under mosaics.
func (m *Mirror) MosaicsAddress() string {
m.readAddress()
return HandleCloneUserCredentials(m.address, true)
}
// FullAddress returns mirror address from Git repository config. // FullAddress returns mirror address from Git repository config.
func (m *Mirror) FullAddress() string { func (m *Mirror) FullAddress() string {
m.readAddress() m.readAddress()
@ -128,11 +136,23 @@ func (m *Mirror) runSync() bool {
wikiPath := m.Repo.WikiPath() wikiPath := m.Repo.WikiPath()
timeout := time.Duration(setting.Git.Timeout.Mirror) * time.Second timeout := time.Duration(setting.Git.Timeout.Mirror) * time.Second
// Do a fast-fail testing against on repository URL to ensure it is accessible under
// good condition to prevent long blocking on URL resolution without syncing anything.
if !git.IsRepoURLAccessible(git.NetworkOptions{
URL: m.FullAddress(),
Timeout: 10 * time.Second,
}) {
desc := fmt.Sprintf("Mirror repository URL is not accessible: %s", m.MosaicsAddress())
if err := CreateRepositoryNotice(desc); err != nil {
log.Error(4, "CreateRepositoryNotice: %v", err)
}
return false
}
gitArgs := []string{"remote", "update"} gitArgs := []string{"remote", "update"}
if m.EnablePrune { if m.EnablePrune {
gitArgs = append(gitArgs, "--prune") gitArgs = append(gitArgs, "--prune")
} }
if _, stderr, err := process.ExecDir( if _, stderr, err := process.ExecDir(
timeout, repoPath, fmt.Sprintf("Mirror.runSync: %s", repoPath), timeout, repoPath, fmt.Sprintf("Mirror.runSync: %s", repoPath),
"git", gitArgs...); err != nil { "git", gitArgs...); err != nil {
@ -223,7 +243,7 @@ func SyncMirrors() {
m, err := GetMirrorByRepoID(com.StrTo(repoID).MustInt64()) m, err := GetMirrorByRepoID(com.StrTo(repoID).MustInt64())
if err != nil { if err != nil {
log.Error(4, "GetMirrorByRepoID [%d]: %v", repoID, err) log.Error(4, "GetMirrorByRepoID [%s]: %v", repoID, err)
continue continue
} }
@ -233,7 +253,7 @@ func SyncMirrors() {
m.ScheduleNextUpdate() m.ScheduleNextUpdate()
if err = UpdateMirror(m); err != nil { if err = UpdateMirror(m); err != nil {
log.Error(4, "UpdateMirror [%d]: %v", repoID, err) log.Error(4, "UpdateMirror [%s]: %v", repoID, err)
continue continue
} }
} }

14
models/ssh_key.go

@ -104,8 +104,18 @@ func extractTypeFromBase64Key(key string) (string, error) {
// parseKeyString parses any key string in OpenSSH or SSH2 format to clean OpenSSH string (RFC4253). // parseKeyString parses any key string in OpenSSH or SSH2 format to clean OpenSSH string (RFC4253).
func parseKeyString(content string) (string, error) { func parseKeyString(content string) (string, error) {
// Transform all legal line endings to a single "\n". // Transform all legal line endings to a single "\n"
content = strings.NewReplacer("\r\n", "\n", "\r", "\n").Replace(content)
// Replace all windows full new lines ("\r\n")
content = strings.Replace(content, "\r\n", "\n", -1)
// Replace all windows half new lines ("\r"), if it happen not to match replace above
content = strings.Replace(content, "\r", "\n", -1)
// Replace ending new line as its may cause unwanted behaviour (extra line means not a single line key | OpenSSH key)
content = strings.TrimRight(content, "\n")
// split lines
lines := strings.Split(content, "\n") lines := strings.Split(content, "\n")
var keyType, keyContent, keyComment string var keyType, keyContent, keyComment string

9
models/token.go

@ -81,8 +81,11 @@ func UpdateAccessToken(t *AccessToken) error {
return err return err
} }
// DeleteAccessTokenByID deletes access token by given ID. // DeleteAccessTokenOfUserByID deletes access token by given ID.
func DeleteAccessTokenByID(id int64) error { func DeleteAccessTokenOfUserByID(userID, id int64) error {
_, err := x.Id(id).Delete(new(AccessToken)) _, err := x.Delete(&AccessToken{
ID: id,
UID: userID,
})
return err return err
} }

4
models/update.go

@ -56,7 +56,7 @@ func CommitToPushCommit(commit *git.Commit) *PushCommit {
AuthorName: commit.Author.Name, AuthorName: commit.Author.Name,
CommitterEmail: commit.Committer.Email, CommitterEmail: commit.Committer.Email,
CommitterName: commit.Committer.Name, CommitterName: commit.Committer.Name,
Timestamp: commit.Author.When, Timestamp: commit.Committer.When,
} }
} }
@ -101,7 +101,7 @@ func PushUpdate(opts PushUpdateOptions) (err error) {
} }
if isDelRef { if isDelRef {
log.GitLogger.Info("Reference '%s' has been deleted from '%s/%s' by %d", log.GitLogger.Info("Reference '%s' has been deleted from '%s/%s' by %s",
opts.RefFullName, opts.RepoUserName, opts.RepoName, opts.PusherName) opts.RefFullName, opts.RepoUserName, opts.RepoName, opts.PusherName)
return nil return nil
} }

41
models/user.go

@ -8,6 +8,7 @@ import (
"bytes" "bytes"
"container/list" "container/list"
"crypto/sha256" "crypto/sha256"
"crypto/subtle"
"encoding/hex" "encoding/hex"
"errors" "errors"
"fmt" "fmt"
@ -23,6 +24,7 @@ import (
"github.com/Unknwon/com" "github.com/Unknwon/com"
"github.com/go-xorm/xorm" "github.com/go-xorm/xorm"
"github.com/nfnt/resize" "github.com/nfnt/resize"
"golang.org/x/crypto/pbkdf2"
"github.com/gogits/git-module" "github.com/gogits/git-module"
api "github.com/gogits/go-gogs-client" api "github.com/gogits/go-gogs-client"
@ -175,7 +177,7 @@ func (u *User) CanEditGitHook() bool {
// CanImportLocal returns true if user can migrate repository by local path. // CanImportLocal returns true if user can migrate repository by local path.
func (u *User) CanImportLocal() bool { func (u *User) CanImportLocal() bool {
return u.IsAdmin || u.AllowImportLocal return setting.Repository.EnableLocalPathMigration && (u.IsAdmin || u.AllowImportLocal)
} }
// DashboardLink returns the user dashboard page link. // DashboardLink returns the user dashboard page link.
@ -315,7 +317,7 @@ func (u *User) NewGitSig() *git.Signature {
// EncodePasswd encodes password to safe format. // EncodePasswd encodes password to safe format.
func (u *User) EncodePasswd() { func (u *User) EncodePasswd() {
newPasswd := base.PBKDF2([]byte(u.Passwd), []byte(u.Salt), 10000, 50, sha256.New) newPasswd := pbkdf2.Key([]byte(u.Passwd), []byte(u.Salt), 10000, 50, sha256.New)
u.Passwd = fmt.Sprintf("%x", newPasswd) u.Passwd = fmt.Sprintf("%x", newPasswd)
} }
@ -323,7 +325,7 @@ func (u *User) EncodePasswd() {
func (u *User) ValidatePassword(passwd string) bool { func (u *User) ValidatePassword(passwd string) bool {
newUser := &User{Passwd: passwd, Salt: u.Salt} newUser := &User{Passwd: passwd, Salt: u.Salt}
newUser.EncodePasswd() newUser.EncodePasswd()
return u.Passwd == newUser.Passwd return subtle.ConstantTimeCompare([]byte(u.Passwd), []byte(newUser.Passwd)) == 1
} }
// UploadAvatar saves custom avatar for user. // UploadAvatar saves custom avatar for user.
@ -417,7 +419,12 @@ func (u *User) GetOrganizationCount() (int64, error) {
// GetRepositories returns repositories that user owns, including private repositories. // GetRepositories returns repositories that user owns, including private repositories.
func (u *User) GetRepositories(page, pageSize int) (err error) { func (u *User) GetRepositories(page, pageSize int) (err error) {
u.Repos, err = GetUserRepositories(u.ID, true, page, pageSize) u.Repos, err = GetUserRepositories(&UserRepoOptions{
UserID: u.ID,
Private: true,
Page: page,
PageSize: pageSize,
})
return err return err
} }
@ -462,6 +469,12 @@ func (u *User) ShortName(length int) string {
return base.EllipsisString(u.Name, length) return base.EllipsisString(u.Name, length)
} }
// IsMailable checks if a user is elegible
// to receive emails.
func (u *User) IsMailable() bool {
return u.IsActive
}
// IsUserExist checks if given user name exist, // IsUserExist checks if given user name exist,
// the user name should be noncased unique. // the user name should be noncased unique.
// If uid is presented, then check will rule out that one, // If uid is presented, then check will rule out that one,
@ -474,7 +487,7 @@ func IsUserExist(uid int64, name string) (bool, error) {
} }
// GetUserSalt returns a ramdom user salt token. // GetUserSalt returns a ramdom user salt token.
func GetUserSalt() string { func GetUserSalt() (string, error) {
return base.GetRandomString(10) return base.GetRandomString(10)
} }
@ -488,12 +501,12 @@ func NewGhostUser() *User {
} }
var ( var (
reversedUsernames = []string{"debug", "raw", "install", "api", "avatar", "user", "org", "help", "stars", "issues", "pulls", "commits", "repo", "template", "admin", "new", ".", ".."} reservedUsernames = []string{"assets", "css", "img", "js", "less", "plugins", "debug", "raw", "install", "api", "avatar", "user", "org", "help", "stars", "issues", "pulls", "commits", "repo", "template", "admin", "new", ".", ".."}
reversedUserPatterns = []string{"*.keys"} reservedUserPatterns = []string{"*.keys"}
) )
// isUsableName checks if name is reserved or pattern of name is not allowed // isUsableName checks if name is reserved or pattern of name is not allowed
// based on given reversed names and patterns. // based on given reserved names and patterns.
// Names are exact match, patterns can be prefix or suffix match with placeholder '*'. // Names are exact match, patterns can be prefix or suffix match with placeholder '*'.
func isUsableName(names, patterns []string, name string) error { func isUsableName(names, patterns []string, name string) error {
name = strings.TrimSpace(strings.ToLower(name)) name = strings.TrimSpace(strings.ToLower(name))
@ -518,7 +531,7 @@ func isUsableName(names, patterns []string, name string) error {
} }
func IsUsableUsername(name string) error { func IsUsableUsername(name string) error {
return isUsableName(reversedUsernames, reversedUserPatterns, name) return isUsableName(reservedUsernames, reservedUserPatterns, name)
} }
// CreateUser creates record of a new user. // CreateUser creates record of a new user.
@ -545,8 +558,12 @@ func CreateUser(u *User) (err error) {
u.LowerName = strings.ToLower(u.Name) u.LowerName = strings.ToLower(u.Name)
u.AvatarEmail = u.Email u.AvatarEmail = u.Email
u.Avatar = base.HashEmail(u.AvatarEmail) u.Avatar = base.HashEmail(u.AvatarEmail)
u.Rands = GetUserSalt() if u.Rands, err = GetUserSalt(); err != nil {
u.Salt = GetUserSalt() return err
}
if u.Salt, err = GetUserSalt(); err != nil {
return err
}
u.EncodePasswd() u.EncodePasswd()
u.MaxRepoCreation = -1 u.MaxRepoCreation = -1
@ -918,8 +935,10 @@ func GetUserEmailsByNames(names []string) []string {
if err != nil { if err != nil {
continue continue
} }
if u.IsMailable() {
mails = append(mails, u.Email) mails = append(mails, u.Email)
} }
}
return mails return mails
} }

14
models/user_mail.go

@ -58,7 +58,15 @@ func isEmailUsed(e Engine, email string) (bool, error) {
return true, nil return true, nil
} }
return e.Get(&EmailAddress{Email: email}) has, err := e.Get(&EmailAddress{Email: email})
if err != nil {
return false, err
} else if has {
return true, nil
}
// We need to check primary email of users as well.
return e.Where("type=?", USER_TYPE_INDIVIDUAL).And("email=?", email).Get(new(User))
} }
// IsEmailUsed returns true if the email has been used. // IsEmailUsed returns true if the email has been used.
@ -111,7 +119,9 @@ func (email *EmailAddress) Activate() error {
if err != nil { if err != nil {
return err return err
} }
user.Rands = GetUserSalt() if user.Rands, err = GetUserSalt(); err != nil {
return err
}
sess := x.NewSession() sess := x.NewSession()
defer sessionRelease(sess) defer sessionRelease(sess)

10
models/webhook.go

@ -252,16 +252,16 @@ func deleteWebhook(bean *Webhook) (err error) {
return sess.Commit() return sess.Commit()
} }
// DeleteWebhookByRepoID deletes webhook of repository by given ID. // DeleteWebhookOfRepoByID deletes webhook of repository by given ID.
func DeleteWebhookByRepoID(repoID, id int64) error { func DeleteWebhookOfRepoByID(repoID, id int64) error {
return deleteWebhook(&Webhook{ return deleteWebhook(&Webhook{
ID: id, ID: id,
RepoID: repoID, RepoID: repoID,
}) })
} }
// DeleteWebhookByOrgID deletes webhook of organization by given ID. // DeleteWebhookOfOrgByID deletes webhook of organization by given ID.
func DeleteWebhookByOrgID(orgID, id int64) error { func DeleteWebhookOfOrgByID(orgID, id int64) error {
return deleteWebhook(&Webhook{ return deleteWebhook(&Webhook{
ID: id, ID: id,
OrgID: orgID, OrgID: orgID,
@ -602,7 +602,7 @@ func DeliverHooks() {
tasks = make([]*HookTask, 0, 5) tasks = make([]*HookTask, 0, 5)
if err := x.Where("repo_id=? AND is_delivered=?", repoID, false).Find(&tasks); err != nil { if err := x.Where("repo_id=? AND is_delivered=?", repoID, false).Find(&tasks); err != nil {
log.Error(4, "Get repository [%d] hook tasks: %v", repoID, err) log.Error(4, "Get repository [%s] hook tasks: %v", repoID, err)
continue continue
} }
for _, t := range tasks { for _, t := range tasks {

9
modules/auth/ldap/ldap.go

@ -59,8 +59,8 @@ func (ls *Source) sanitizedUserQuery(username string) (string, bool) {
func (ls *Source) sanitizedUserDN(username string) (string, bool) { func (ls *Source) sanitizedUserDN(username string) (string, bool) {
// See http://tools.ietf.org/search/rfc4514: "special characters" // See http://tools.ietf.org/search/rfc4514: "special characters"
badCharacters := "\x00()*\\,='\"#+;<> " badCharacters := "\x00()*\\,='\"#+;<>"
if strings.ContainsAny(username, badCharacters) { if strings.ContainsAny(username, badCharacters) || strings.HasPrefix(username, " ") || strings.HasSuffix(username, " ") {
log.Debug("'%s' contains invalid DN characters. Aborting.", username) log.Debug("'%s' contains invalid DN characters. Aborting.", username)
return "", false return "", false
} }
@ -150,6 +150,11 @@ func bindUser(l *ldap.Conn, userDN, passwd string) error {
// searchEntry : search an LDAP source if an entry (name, passwd) is valid and in the specific filter // searchEntry : search an LDAP source if an entry (name, passwd) is valid and in the specific filter
func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, string, string, string, bool, bool) { func (ls *Source) SearchEntry(name, passwd string, directBind bool) (string, string, string, string, bool, bool) {
// See https://tools.ietf.org/search/rfc4513#section-5.1.2
if len(passwd) == 0 {
log.Debug("Auth. failed for %s, password cannot be empty")
return "", "", "", "", false, false
}
l, err := dial(ls) l, err := dial(ls)
if err != nil { if err != nil {
log.Error(4, "LDAP Connect error, %s:%v", ls.Host, err) log.Error(4, "LDAP Connect error, %s:%v", ls.Host, err)

3
modules/auth/repo_form.go

@ -53,7 +53,7 @@ func (f *MigrateRepoForm) Validate(ctx *macaron.Context, errs binding.Errors) bi
} }
// ParseRemoteAddr checks if given remote address is valid, // ParseRemoteAddr checks if given remote address is valid,
// and returns composed URL with needed username and passowrd. // and returns composed URL with needed username and password.
// It also checks if given user has permission when remote address // It also checks if given user has permission when remote address
// is actually a local path. // is actually a local path.
func (f MigrateRepoForm) ParseRemoteAddr(user *models.User) (string, error) { func (f MigrateRepoForm) ParseRemoteAddr(user *models.User) (string, error) {
@ -96,6 +96,7 @@ type RepoSettingForm struct {
ExternalWikiURL string ExternalWikiURL string
EnableIssues bool EnableIssues bool
EnableExternalTracker bool EnableExternalTracker bool
ExternalTrackerURL string
TrackerURLFormat string TrackerURLFormat string
TrackerIssueStyle string TrackerIssueStyle string
EnablePulls bool EnablePulls bool

73
modules/base/tool.go

@ -5,16 +5,15 @@
package base package base
import ( import (
"crypto/hmac"
"crypto/md5" "crypto/md5"
"crypto/rand" "crypto/rand"
"crypto/sha1" "crypto/sha1"
"encoding/base64" "encoding/base64"
"encoding/hex" "encoding/hex"
"fmt" "fmt"
"hash"
"html/template" "html/template"
"math" "math"
"math/big"
"net/http" "net/http"
"strings" "strings"
"time" "time"
@ -82,57 +81,31 @@ func BasicAuthEncode(username, password string) string {
} }
// GetRandomString generate random string by specify chars. // GetRandomString generate random string by specify chars.
func GetRandomString(n int, alphabets ...byte) string { func GetRandomString(n int) (string, error) {
const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
var bytes = make([]byte, n)
rand.Read(bytes)
for i, b := range bytes {
if len(alphabets) == 0 {
bytes[i] = alphanum[b%byte(len(alphanum))]
} else {
bytes[i] = alphabets[b%byte(len(alphabets))]
}
}
return string(bytes)
}
// http://code.google.com/p/go/source/browse/pbkdf2/pbkdf2.go?repo=crypto buffer := make([]byte, n)
// FIXME: use https://godoc.org/golang.org/x/crypto/pbkdf2? max := big.NewInt(int64(len(alphanum)))
func PBKDF2(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte {
prf := hmac.New(h, password)
hashLen := prf.Size()
numBlocks := (keyLen + hashLen - 1) / hashLen
var buf [4]byte for i := 0; i < n; i++ {
dk := make([]byte, 0, numBlocks*hashLen) index, err := randomInt(max)
U := make([]byte, hashLen) if err != nil {
for block := 1; block <= numBlocks; block++ { return "", err
// N.B.: || means concatenation, ^ means XOR
// for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter
// U_1 = PRF(password, salt || uint(i))
prf.Reset()
prf.Write(salt)
buf[0] = byte(block >> 24)
buf[1] = byte(block >> 16)
buf[2] = byte(block >> 8)
buf[3] = byte(block)
prf.Write(buf[:4])
dk = prf.Sum(dk)
T := dk[len(dk)-hashLen:]
copy(U, T)
// U_n = PRF(password, U_(n-1))
for n := 2; n <= iter; n++ {
prf.Reset()
prf.Write(U)
U = U[:0]
U = prf.Sum(U)
for x := range U {
T[x] ^= U[x]
} }
buffer[i] = alphanum[index]
} }
return string(buffer), nil
}
func randomInt(max *big.Int) (int, error) {
rand, err := rand.Int(rand.Reader, max)
if err != nil {
return 0, err
} }
return dk[:keyLen]
return int(rand.Int64()), nil
} }
// verify time limit code // verify time limit code
@ -212,7 +185,7 @@ func AvatarLink(email string) (url string) {
var err error var err error
url, err = setting.LibravatarService.FromEmail(email) url, err = setting.LibravatarService.FromEmail(email)
if err != nil { if err != nil {
log.Error(1, "LibravatarService.FromEmail: %v", err) log.Error(4, "LibravatarService.FromEmail [%s]: %v", email, err)
} }
} }
if len(url) == 0 && !setting.DisableGravatar { if len(url) == 0 && !setting.DisableGravatar {
@ -533,3 +506,7 @@ func IsImageFile(data []byte) bool {
func IsPDFFile(data []byte) bool { func IsPDFFile(data []byte) bool {
return strings.Index(http.DetectContentType(data), "application/pdf") != -1 return strings.Index(http.DetectContentType(data), "application/pdf") != -1
} }
func IsVideoFile(data []byte) bool {
return strings.Index(http.DetectContentType(data), "video/") != -1
}

1136
modules/bindata/bindata.go

File diff suppressed because one or more lines are too long

5
modules/context/context.go

@ -156,6 +156,11 @@ func Contexter() macaron.Handler {
}, },
Org: &Organization{}, Org: &Organization{},
} }
if len(setting.HTTP.AccessControlAllowOrigin) > 0 {
ctx.Header().Set("Access-Control-Allow-Origin", setting.HTTP.AccessControlAllowOrigin)
}
// Compute current URL for real-time change language. // Compute current URL for real-time change language.
ctx.Data["Link"] = setting.AppSubUrl + strings.TrimSuffix(ctx.Req.URL.Path, "/") ctx.Data["Link"] = setting.AppSubUrl + strings.TrimSuffix(ctx.Req.URL.Path, "/")

63
modules/context/repo.go

@ -256,6 +256,7 @@ func RepoAssignment(args ...bool) macaron.Handler {
ctx.Data["IsRepositoryWriter"] = ctx.Repo.IsWriter() ctx.Data["IsRepositoryWriter"] = ctx.Repo.IsWriter()
ctx.Data["DisableSSH"] = setting.SSH.Disabled ctx.Data["DisableSSH"] = setting.SSH.Disabled
ctx.Data["DisableHTTP"] = setting.Repository.DisableHTTPGit
ctx.Data["CloneLink"] = repo.CloneLink() ctx.Data["CloneLink"] = repo.CloneLink()
ctx.Data["WikiCloneLink"] = repo.WikiCloneLink() ctx.Data["WikiCloneLink"] = repo.WikiCloneLink()
@ -299,37 +300,6 @@ func RepoAssignment(args ...bool) macaron.Handler {
ctx.Data["BranchName"] = ctx.Repo.BranchName ctx.Data["BranchName"] = ctx.Repo.BranchName
ctx.Data["CommitID"] = ctx.Repo.CommitID ctx.Data["CommitID"] = ctx.Repo.CommitID
if repo.IsFork {
RetrieveBaseRepo(ctx, repo)
if ctx.Written() {
return
}
}
// People who have push access or have fored repository can propose a new pull request.
if ctx.Repo.IsWriter() || (ctx.IsSigned && ctx.User.HasForkedRepo(ctx.Repo.Repository.ID)) {
// Pull request is allowed if this is a fork repository
// and base repository accepts pull requests.
if repo.BaseRepo != nil {
if repo.BaseRepo.AllowsPulls() {
ctx.Data["BaseRepo"] = repo.BaseRepo
ctx.Repo.PullRequest.BaseRepo = repo.BaseRepo
ctx.Repo.PullRequest.Allowed = true
ctx.Repo.PullRequest.HeadInfo = ctx.Repo.Owner.Name + ":" + ctx.Repo.BranchName
}
} else {
// Or, this is repository accepts pull requests between branches.
if repo.AllowsPulls() {
ctx.Data["BaseRepo"] = repo
ctx.Repo.PullRequest.BaseRepo = repo
ctx.Repo.PullRequest.Allowed = true
ctx.Repo.PullRequest.SameRepo = true
ctx.Repo.PullRequest.HeadInfo = ctx.Repo.BranchName
}
}
}
ctx.Data["PullRequestCtx"] = ctx.Repo.PullRequest
if ctx.Query("go-get") == "1" { if ctx.Query("go-get") == "1" {
ctx.Data["GoGetImport"] = composeGoGetImport(owner.Name, repo.Name) ctx.Data["GoGetImport"] = composeGoGetImport(owner.Name, repo.Name)
prefix := setting.AppUrl + path.Join(owner.Name, repo.Name, "src", ctx.Repo.BranchName) prefix := setting.AppUrl + path.Join(owner.Name, repo.Name, "src", ctx.Repo.BranchName)
@ -442,6 +412,37 @@ func RepoRef() macaron.Handler {
ctx.Data["IsViewTag"] = ctx.Repo.IsViewTag ctx.Data["IsViewTag"] = ctx.Repo.IsViewTag
ctx.Data["IsViewCommit"] = ctx.Repo.IsViewCommit ctx.Data["IsViewCommit"] = ctx.Repo.IsViewCommit
if ctx.Repo.Repository.IsFork {
RetrieveBaseRepo(ctx, ctx.Repo.Repository)
if ctx.Written() {
return
}
}
// People who have push access or have fored repository can propose a new pull request.
if ctx.Repo.IsWriter() || (ctx.IsSigned && ctx.User.HasForkedRepo(ctx.Repo.Repository.ID)) {
// Pull request is allowed if this is a fork repository
// and base repository accepts pull requests.
if ctx.Repo.Repository.BaseRepo != nil {
if ctx.Repo.Repository.BaseRepo.AllowsPulls() {
ctx.Data["BaseRepo"] = ctx.Repo.Repository.BaseRepo
ctx.Repo.PullRequest.BaseRepo = ctx.Repo.Repository.BaseRepo
ctx.Repo.PullRequest.Allowed = true
ctx.Repo.PullRequest.HeadInfo = ctx.Repo.Owner.Name + ":" + ctx.Repo.BranchName
}
} else {
// Or, this is repository accepts pull requests between branches.
if ctx.Repo.Repository.AllowsPulls() {
ctx.Data["BaseRepo"] = ctx.Repo.Repository
ctx.Repo.PullRequest.BaseRepo = ctx.Repo.Repository
ctx.Repo.PullRequest.Allowed = true
ctx.Repo.PullRequest.SameRepo = true
ctx.Repo.PullRequest.HeadInfo = ctx.Repo.BranchName
}
}
}
ctx.Data["PullRequestCtx"] = ctx.Repo.PullRequest
ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount() ctx.Repo.CommitsCount, err = ctx.Repo.Commit.CommitsCount()
if err != nil { if err != nil {
ctx.Handle(500, "CommitsCount", err) ctx.Handle(500, "CommitsCount", err)

90
models/mail.go → modules/mailer/mail.go

@ -2,19 +2,17 @@
// Use of this source code is governed by a MIT-style // Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
package models package mailer
import ( import (
"fmt" "fmt"
"html/template" "html/template"
"path"
"gopkg.in/gomail.v2" "gopkg.in/gomail.v2"
"gopkg.in/macaron.v1" "gopkg.in/macaron.v1"
"github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/mailer"
"github.com/gogits/gogs/modules/markdown" "github.com/gogits/gogs/modules/markdown"
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
) )
@ -54,10 +52,34 @@ func InitMailRender(dir, appendDir string, funcMap []template.FuncMap) {
} }
func SendTestMail(email string) error { func SendTestMail(email string) error {
return gomail.Send(&mailer.Sender{}, mailer.NewMessage([]string{email}, "Gogs Test Email!", "Gogs Test Email!").Message) return gomail.Send(&Sender{}, NewMessage([]string{email}, "Gogs Test Email!", "Gogs Test Email!").Message)
} }
func SendUserMail(c *macaron.Context, u *User, tpl base.TplName, code, subject, info string) { /*
Setup interfaces of used methods in mail to avoid cycle import.
*/
type User interface {
ID() int64
DisplayName() string
Email() string
GenerateActivateCode() string
GenerateEmailActivateCode(string) string
}
type Repository interface {
FullName() string
HTMLURL() string
ComposeMetas() map[string]string
}
type Issue interface {
MailSubject() string
Content() string
HTMLURL() string
}
func SendUserMail(c *macaron.Context, u User, tpl base.TplName, code, subject, info string) {
data := map[string]interface{}{ data := map[string]interface{}{
"Username": u.DisplayName(), "Username": u.DisplayName(),
"ActiveCodeLives": setting.Service.ActiveCodeLives / 60, "ActiveCodeLives": setting.Service.ActiveCodeLives / 60,
@ -70,27 +92,27 @@ func SendUserMail(c *macaron.Context, u *User, tpl base.TplName, code, subject,
return return
} }
msg := mailer.NewMessage([]string{u.Email}, subject, body) msg := NewMessage([]string{u.Email()}, subject, body)
msg.Info = fmt.Sprintf("UID: %d, %s", u.ID, info) msg.Info = fmt.Sprintf("UID: %d, %s", u.ID(), info)
mailer.SendAsync(msg) SendAsync(msg)
} }
func SendActivateAccountMail(c *macaron.Context, u *User) { func SendActivateAccountMail(c *macaron.Context, u User) {
SendUserMail(c, u, MAIL_AUTH_ACTIVATE, u.GenerateActivateCode(), c.Tr("mail.activate_account"), "activate account") SendUserMail(c, u, MAIL_AUTH_ACTIVATE, u.GenerateActivateCode(), c.Tr("mail.activate_account"), "activate account")
} }
func SendResetPasswordMail(c *macaron.Context, u *User) { func SendResetPasswordMail(c *macaron.Context, u User) {
SendUserMail(c, u, MAIL_AUTH_RESET_PASSWORD, u.GenerateActivateCode(), c.Tr("mail.reset_password"), "reset password") SendUserMail(c, u, MAIL_AUTH_RESET_PASSWORD, u.GenerateActivateCode(), c.Tr("mail.reset_password"), "reset password")
} }
// SendActivateAccountMail sends confirmation email. // SendActivateAccountMail sends confirmation email.
func SendActivateEmailMail(c *macaron.Context, u *User, email *EmailAddress) { func SendActivateEmailMail(c *macaron.Context, u User, email string) {
data := map[string]interface{}{ data := map[string]interface{}{
"Username": u.DisplayName(), "Username": u.DisplayName(),
"ActiveCodeLives": setting.Service.ActiveCodeLives / 60, "ActiveCodeLives": setting.Service.ActiveCodeLives / 60,
"Code": u.GenerateEmailActivateCode(email.Email), "Code": u.GenerateEmailActivateCode(email),
"Email": email.Email, "Email": email,
} }
body, err := mailRender.HTMLString(string(MAIL_AUTH_ACTIVATE_EMAIL), data) body, err := mailRender.HTMLString(string(MAIL_AUTH_ACTIVATE_EMAIL), data)
if err != nil { if err != nil {
@ -98,14 +120,14 @@ func SendActivateEmailMail(c *macaron.Context, u *User, email *EmailAddress) {
return return
} }
msg := mailer.NewMessage([]string{email.Email}, c.Tr("mail.activate_email"), body) msg := NewMessage([]string{email}, c.Tr("mail.activate_email"), body)
msg.Info = fmt.Sprintf("UID: %d, activate email", u.ID) msg.Info = fmt.Sprintf("UID: %d, activate email", u.ID())
mailer.SendAsync(msg) SendAsync(msg)
} }
// SendRegisterNotifyMail triggers a notify e-mail by admin created a account. // SendRegisterNotifyMail triggers a notify e-mail by admin created a account.
func SendRegisterNotifyMail(c *macaron.Context, u *User) { func SendRegisterNotifyMail(c *macaron.Context, u User) {
data := map[string]interface{}{ data := map[string]interface{}{
"Username": u.DisplayName(), "Username": u.DisplayName(),
} }
@ -115,20 +137,19 @@ func SendRegisterNotifyMail(c *macaron.Context, u *User) {
return return
} }
msg := mailer.NewMessage([]string{u.Email}, c.Tr("mail.register_notify"), body) msg := NewMessage([]string{u.Email()}, c.Tr("mail.register_notify"), body)
msg.Info = fmt.Sprintf("UID: %d, registration notify", u.ID) msg.Info = fmt.Sprintf("UID: %d, registration notify", u.ID())
mailer.SendAsync(msg) SendAsync(msg)
} }
// SendCollaboratorMail sends mail notification to new collaborator. // SendCollaboratorMail sends mail notification to new collaborator.
func SendCollaboratorMail(u, doer *User, repo *Repository) { func SendCollaboratorMail(u, doer User, repo Repository) {
repoName := path.Join(repo.Owner.Name, repo.Name) subject := fmt.Sprintf("%s added you to %s", doer.DisplayName(), repo.FullName())
subject := fmt.Sprintf("%s added you to %s", doer.DisplayName(), repoName)
data := map[string]interface{}{ data := map[string]interface{}{
"Subject": subject, "Subject": subject,
"RepoName": repoName, "RepoName": repo.FullName(),
"Link": repo.HTMLURL(), "Link": repo.HTMLURL(),
} }
body, err := mailRender.HTMLString(string(MAIL_NOTIFY_COLLABORATOR), data) body, err := mailRender.HTMLString(string(MAIL_NOTIFY_COLLABORATOR), data)
@ -137,10 +158,10 @@ func SendCollaboratorMail(u, doer *User, repo *Repository) {
return return
} }
msg := mailer.NewMessage([]string{u.Email}, subject, body) msg := NewMessage([]string{u.Email()}, subject, body)
msg.Info = fmt.Sprintf("UID: %d, add collaborator", u.ID) msg.Info = fmt.Sprintf("UID: %d, add collaborator", u.ID())
mailer.SendAsync(msg) SendAsync(msg)
} }
func composeTplData(subject, body, link string) map[string]interface{} { func composeTplData(subject, body, link string) map[string]interface{} {
@ -151,33 +172,34 @@ func composeTplData(subject, body, link string) map[string]interface{} {
return data return data
} }
func composeIssueMessage(issue *Issue, doer *User, tplName base.TplName, tos []string, info string) *mailer.Message { func composeIssueMessage(issue Issue, repo Repository, doer User, tplName base.TplName, tos []string, info string) *Message {
subject := issue.MailSubject() subject := issue.MailSubject()
body := string(markdown.RenderSpecialLink([]byte(issue.Content), issue.Repo.HTMLURL(), issue.Repo.ComposeMetas())) body := string(markdown.RenderSpecialLink([]byte(issue.Content()), repo.HTMLURL(), repo.ComposeMetas()))
data := composeTplData(subject, body, issue.HTMLURL()) data := composeTplData(subject, body, issue.HTMLURL())
data["Doer"] = doer data["Doer"] = doer
content, err := mailRender.HTMLString(string(tplName), data) content, err := mailRender.HTMLString(string(tplName), data)
if err != nil { if err != nil {
log.Error(3, "HTMLString (%s): %v", tplName, err) log.Error(3, "HTMLString (%s): %v", tplName, err)
} }
msg := mailer.NewMessageFrom(tos, fmt.Sprintf(`"%s" <%s>`, doer.DisplayName(), setting.MailService.User), subject, content) from := gomail.NewMessage().FormatAddress(setting.MailService.FromEmail, doer.DisplayName())
msg := NewMessageFrom(tos, from, subject, content)
msg.Info = fmt.Sprintf("Subject: %s, %s", subject, info) msg.Info = fmt.Sprintf("Subject: %s, %s", subject, info)
return msg return msg
} }
// SendIssueCommentMail composes and sends issue comment emails to target receivers. // SendIssueCommentMail composes and sends issue comment emails to target receivers.
func SendIssueCommentMail(issue *Issue, doer *User, tos []string) { func SendIssueCommentMail(issue Issue, repo Repository, doer User, tos []string) {
if len(tos) == 0 { if len(tos) == 0 {
return return
} }
mailer.SendAsync(composeIssueMessage(issue, doer, MAIL_ISSUE_COMMENT, tos, "issue comment")) SendAsync(composeIssueMessage(issue, repo, doer, MAIL_ISSUE_COMMENT, tos, "issue comment"))
} }
// SendIssueMentionMail composes and sends issue mention emails to target receivers. // SendIssueMentionMail composes and sends issue mention emails to target receivers.
func SendIssueMentionMail(issue *Issue, doer *User, tos []string) { func SendIssueMentionMail(issue Issue, repo Repository, doer User, tos []string) {
if len(tos) == 0 { if len(tos) == 0 {
return return
} }
mailer.SendAsync(composeIssueMessage(issue, doer, MAIL_ISSUE_MENTION, tos, "issue mention")) SendAsync(composeIssueMessage(issue, repo, doer, MAIL_ISSUE_MENTION, tos, "issue mention"))
} }

43
modules/markdown/markdown.go

@ -76,7 +76,7 @@ func IsReadmeFile(name string) bool {
var ( var (
// MentionPattern matches string that mentions someone, e.g. @Unknwon // MentionPattern matches string that mentions someone, e.g. @Unknwon
MentionPattern = regexp.MustCompile(`(\s|^)@[0-9a-zA-Z-_\.]+`) MentionPattern = regexp.MustCompile(`(\s|^|\W)@[0-9a-zA-Z-_\.]+`)
// CommitPattern matches link to certain commit with or without trailing hash, // CommitPattern matches link to certain commit with or without trailing hash,
// e.g. https://try.gogs.io/gogs/gogs/commit/d8a994ef243349f321568f9e36d5c3f444b99cae#diff-2 // e.g. https://try.gogs.io/gogs/gogs/commit/d8a994ef243349f321568f9e36d5c3f444b99cae#diff-2
@ -89,6 +89,9 @@ var (
IssueNumericPattern = regexp.MustCompile(`( |^|\()#[0-9]+\b`) IssueNumericPattern = regexp.MustCompile(`( |^|\()#[0-9]+\b`)
// IssueAlphanumericPattern matches string that references to an alphanumeric issue, e.g. ABC-1234 // IssueAlphanumericPattern matches string that references to an alphanumeric issue, e.g. ABC-1234
IssueAlphanumericPattern = regexp.MustCompile(`( |^|\()[A-Z]{1,10}-[1-9][0-9]*\b`) IssueAlphanumericPattern = regexp.MustCompile(`( |^|\()[A-Z]{1,10}-[1-9][0-9]*\b`)
// CrossReferenceIssueNumericPattern matches string that references a numeric issue in a difference repository
// e.g. gogits/gogs#12345
CrossReferenceIssueNumericPattern = regexp.MustCompile(`( |^)[0-9a-zA-Z-_\.]+/[0-9a-zA-Z-_\.]+#[0-9]+\b`)
// Sha1CurrentPattern matches string that represents a commit SHA, e.g. d8a994ef243349f321568f9e36d5c3f444b99cae // Sha1CurrentPattern matches string that represents a commit SHA, e.g. d8a994ef243349f321568f9e36d5c3f444b99cae
// FIXME: this pattern matches pure numbers as well, right now we do a hack to check in RenderSha1CurrentPattern // FIXME: this pattern matches pure numbers as well, right now we do a hack to check in RenderSha1CurrentPattern
@ -101,7 +104,7 @@ var (
func FindAllMentions(content string) []string { func FindAllMentions(content string) []string {
mentions := MentionPattern.FindAllString(content, -1) mentions := MentionPattern.FindAllString(content, -1)
for i := range mentions { for i := range mentions {
mentions[i] = strings.TrimSpace(mentions[i])[1:] // Strip @ character mentions[i] = mentions[i][strings.Index(mentions[i], "@")+1:] // Strip @ character
} }
return mentions return mentions
} }
@ -154,7 +157,19 @@ func (r *Renderer) AutoLink(out *bytes.Buffer, link []byte, kind int) {
if j == -1 { if j == -1 {
j = len(m) j = len(m)
} }
out.WriteString(fmt.Sprintf(`<a href="%s">#%s</a>`, m, base.ShortSha(string(m[i+7:j]))))
index := string(m[i+7 : j])
fullRepoURL := setting.AppUrl + strings.TrimPrefix(r.urlPrefix, "/")
var link string
if strings.HasPrefix(string(m), fullRepoURL) {
// Use a short issue reference if the URL refers to this repository
link = fmt.Sprintf(`<a href="%s">#%s</a>`, m, index)
} else {
// Use a cross-repository issue reference if the URL refers to a different repository
repo := string(m[len(setting.AppUrl) : i-1])
link = fmt.Sprintf(`<a href="%s">%s#%s</a>`, m, repo, index)
}
out.WriteString(link)
return return
} }
} }
@ -181,6 +196,7 @@ var (
svgSuffixWithMark = []byte(".svg?") svgSuffixWithMark = []byte(".svg?")
spaceBytes = []byte(" ") spaceBytes = []byte(" ")
spaceEncodedBytes = []byte("%20") spaceEncodedBytes = []byte("%20")
pound = []byte("#")
space = " " space = " "
spaceEncoded = "%20" spaceEncoded = "%20"
) )
@ -261,6 +277,24 @@ func RenderIssueIndexPattern(rawBytes []byte, urlPrefix string, metas map[string
return rawBytes return rawBytes
} }
// RenderCrossReferenceIssueIndexPattern renders issue indexes from other repositories to corresponding links.
func RenderCrossReferenceIssueIndexPattern(rawBytes []byte, urlPrefix string, metas map[string]string) []byte {
ms := CrossReferenceIssueNumericPattern.FindAll(rawBytes, -1)
for _, m := range ms {
if m[0] == ' ' || m[0] == '(' {
m = m[1:] // ignore leading space or opening parentheses
}
delimIdx := bytes.Index(m, pound)
repo := string(m[:delimIdx])
index := string(m[delimIdx+1:])
link := fmt.Sprintf(`<a href="%s%s/issues/%s">%s</a>`, setting.AppUrl, repo, index, m)
rawBytes = bytes.Replace(rawBytes, m, []byte(link), 1)
}
return rawBytes
}
// RenderSha1CurrentPattern renders SHA1 strings to corresponding links that assumes in the same repository. // RenderSha1CurrentPattern renders SHA1 strings to corresponding links that assumes in the same repository.
func RenderSha1CurrentPattern(rawBytes []byte, urlPrefix string) []byte { func RenderSha1CurrentPattern(rawBytes []byte, urlPrefix string) []byte {
return []byte(Sha1CurrentPattern.ReplaceAllStringFunc(string(rawBytes[:]), func(m string) string { return []byte(Sha1CurrentPattern.ReplaceAllStringFunc(string(rawBytes[:]), func(m string) string {
@ -275,12 +309,13 @@ func RenderSha1CurrentPattern(rawBytes []byte, urlPrefix string) []byte {
func RenderSpecialLink(rawBytes []byte, urlPrefix string, metas map[string]string) []byte { func RenderSpecialLink(rawBytes []byte, urlPrefix string, metas map[string]string) []byte {
ms := MentionPattern.FindAll(rawBytes, -1) ms := MentionPattern.FindAll(rawBytes, -1)
for _, m := range ms { for _, m := range ms {
m = bytes.TrimSpace(m) m = m[bytes.Index(m, []byte("@")):]
rawBytes = bytes.Replace(rawBytes, m, rawBytes = bytes.Replace(rawBytes, m,
[]byte(fmt.Sprintf(`<a href="%s/%s">%s</a>`, setting.AppSubUrl, m[1:], m)), -1) []byte(fmt.Sprintf(`<a href="%s/%s">%s</a>`, setting.AppSubUrl, m[1:], m)), -1)
} }
rawBytes = RenderIssueIndexPattern(rawBytes, urlPrefix, metas) rawBytes = RenderIssueIndexPattern(rawBytes, urlPrefix, metas)
rawBytes = RenderCrossReferenceIssueIndexPattern(rawBytes, urlPrefix, metas)
rawBytes = RenderSha1CurrentPattern(rawBytes, urlPrefix) rawBytes = RenderSha1CurrentPattern(rawBytes, urlPrefix)
return rawBytes return rawBytes
} }

49
modules/setting/setting.go

@ -6,6 +6,7 @@ package setting
import ( import (
"fmt" "fmt"
"net/mail"
"net/url" "net/url"
"os" "os"
"os/exec" "os/exec"
@ -21,9 +22,10 @@ import (
_ "github.com/go-macaron/cache/redis" _ "github.com/go-macaron/cache/redis"
"github.com/go-macaron/session" "github.com/go-macaron/session"
_ "github.com/go-macaron/session/redis" _ "github.com/go-macaron/session/redis"
"github.com/strk/go-libravatar"
"gopkg.in/ini.v1" "gopkg.in/ini.v1"
"github.com/gogits/go-libravatar"
"github.com/gogits/gogs/modules/bindata" "github.com/gogits/gogs/modules/bindata"
"github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/user" "github.com/gogits/gogs/modules/user"
@ -32,10 +34,10 @@ import (
type Scheme string type Scheme string
const ( const (
HTTP Scheme = "http" SCHEME_HTTP Scheme = "http"
HTTPS Scheme = "https" SCHEME_HTTPS Scheme = "https"
FCGI Scheme = "fcgi" SCHEME_FCGI Scheme = "fcgi"
UNIX_SOCKET Scheme = "unix" SCHEME_UNIX_SOCKET Scheme = "unix"
) )
type LandingPage string type LandingPage string
@ -72,11 +74,16 @@ var (
LandingPageURL LandingPage LandingPageURL LandingPage
UnixSocketPermission uint32 UnixSocketPermission uint32
HTTP struct {
AccessControlAllowOrigin string
}
SSH struct { SSH struct {
Disabled bool `ini:"DISABLE_SSH"` Disabled bool `ini:"DISABLE_SSH"`
StartBuiltinServer bool `ini:"START_SSH_SERVER"` StartBuiltinServer bool `ini:"START_SSH_SERVER"`
Domain string `ini:"SSH_DOMAIN"` Domain string `ini:"SSH_DOMAIN"`
Port int `ini:"SSH_PORT"` Port int `ini:"SSH_PORT"`
ListenHost string `ini:"SSH_LISTEN_HOST"`
ListenPort int `ini:"SSH_LISTEN_PORT"` ListenPort int `ini:"SSH_LISTEN_PORT"`
RootPath string `ini:"SSH_ROOT_PATH"` RootPath string `ini:"SSH_ROOT_PATH"`
KeyTestPath string `ini:"SSH_KEY_TEST_PATH"` KeyTestPath string `ini:"SSH_KEY_TEST_PATH"`
@ -116,6 +123,8 @@ var (
MirrorQueueLength int MirrorQueueLength int
PullRequestQueueLength int PullRequestQueueLength int
PreferredLicenses []string PreferredLicenses []string
DisableHTTPGit bool `ini:"DISABLE_HTTP_GIT"`
EnableLocalPathMigration bool
// Repository editor settings // Repository editor settings
Editor struct { Editor struct {
@ -383,15 +392,15 @@ func NewContext() {
AppSubUrl = strings.TrimSuffix(url.Path, "/") AppSubUrl = strings.TrimSuffix(url.Path, "/")
AppSubUrlDepth = strings.Count(AppSubUrl, "/") AppSubUrlDepth = strings.Count(AppSubUrl, "/")
Protocol = HTTP Protocol = SCHEME_HTTP
if sec.Key("PROTOCOL").String() == "https" { if sec.Key("PROTOCOL").String() == "https" {
Protocol = HTTPS Protocol = SCHEME_HTTPS
CertFile = sec.Key("CERT_FILE").String() CertFile = sec.Key("CERT_FILE").String()
KeyFile = sec.Key("KEY_FILE").String() KeyFile = sec.Key("KEY_FILE").String()
} else if sec.Key("PROTOCOL").String() == "fcgi" { } else if sec.Key("PROTOCOL").String() == "fcgi" {
Protocol = FCGI Protocol = SCHEME_FCGI
} else if sec.Key("PROTOCOL").String() == "unix" { } else if sec.Key("PROTOCOL").String() == "unix" {
Protocol = UNIX_SOCKET Protocol = SCHEME_UNIX_SOCKET
UnixSocketPermissionRaw := sec.Key("UNIX_SOCKET_PERMISSION").MustString("666") UnixSocketPermissionRaw := sec.Key("UNIX_SOCKET_PERMISSION").MustString("666")
UnixSocketPermissionParsed, err := strconv.ParseUint(UnixSocketPermissionRaw, 8, 32) UnixSocketPermissionParsed, err := strconv.ParseUint(UnixSocketPermissionRaw, 8, 32)
if err != nil || UnixSocketPermissionParsed > 0777 { if err != nil || UnixSocketPermissionParsed > 0777 {
@ -488,6 +497,8 @@ func NewContext() {
} }
} }
ProdMode = Cfg.Section("").Key("RUN_MODE").String() == "prod"
// Determine and create root git repository path. // Determine and create root git repository path.
sec = Cfg.Section("repository") sec = Cfg.Section("repository")
RepoRootPath = sec.Key("ROOT").MustString(path.Join(homeDir, "gogs-repositories")) RepoRootPath = sec.Key("ROOT").MustString(path.Join(homeDir, "gogs-repositories"))
@ -521,11 +532,13 @@ func NewContext() {
GravatarSource = "http://gravatar.duoshuo.com/avatar/" GravatarSource = "http://gravatar.duoshuo.com/avatar/"
case "gravatar": case "gravatar":
GravatarSource = "https://secure.gravatar.com/avatar/" GravatarSource = "https://secure.gravatar.com/avatar/"
case "libravatar":
GravatarSource = "https://seccdn.libravatar.org/avatar/"
default: default:
GravatarSource = source GravatarSource = source
} }
DisableGravatar = sec.Key("DISABLE_GRAVATAR").MustBool() DisableGravatar = sec.Key("DISABLE_GRAVATAR").MustBool()
EnableFederatedAvatar = sec.Key("ENABLE_FEDERATED_AVATAR").MustBool() EnableFederatedAvatar = sec.Key("ENABLE_FEDERATED_AVATAR").MustBool(true)
if OfflineMode { if OfflineMode {
DisableGravatar = true DisableGravatar = true
EnableFederatedAvatar = false EnableFederatedAvatar = false
@ -548,7 +561,9 @@ func NewContext() {
} }
} }
if err = Cfg.Section("ui").MapTo(&UI); err != nil { if err = Cfg.Section("http").MapTo(&HTTP); err != nil {
log.Fatal(4, "Fail to map HTTP settings: %v", err)
} else if err = Cfg.Section("ui").MapTo(&UI); err != nil {
log.Fatal(4, "Fail to map UI settings: %v", err) log.Fatal(4, "Fail to map UI settings: %v", err)
} else if err = Cfg.Section("markdown").MapTo(&Markdown); err != nil { } else if err = Cfg.Section("markdown").MapTo(&Markdown); err != nil {
log.Fatal(4, "Fail to map Markdown settings: %v", err) log.Fatal(4, "Fail to map Markdown settings: %v", err)
@ -664,11 +679,11 @@ func newLogService() {
sec.Key("PROTOCOL").In("tcp", []string{"tcp", "unix", "udp"}), sec.Key("PROTOCOL").In("tcp", []string{"tcp", "unix", "udp"}),
sec.Key("ADDR").MustString(":7020")) sec.Key("ADDR").MustString(":7020"))
case "smtp": case "smtp":
LogConfigs[i] = fmt.Sprintf(`{"level":%s,"username":"%s","password":"%s","host":"%s","sendTos":"%s","subject":"%s"}`, level, LogConfigs[i] = fmt.Sprintf(`{"level":%s,"username":"%s","password":"%s","host":"%s","sendTos":["%s"],"subject":"%s"}`, level,
sec.Key("USER").MustString("example@example.com"), sec.Key("USER").MustString("example@example.com"),
sec.Key("PASSWD").MustString("******"), sec.Key("PASSWD").MustString("******"),
sec.Key("HOST").MustString("127.0.0.1:25"), sec.Key("HOST").MustString("127.0.0.1:25"),
sec.Key("RECEIVERS").MustString("[]"), strings.Replace(sec.Key("RECEIVERS").MustString(""), ",", `","`, -1),
sec.Key("SUBJECT").MustString("Diagnostic message from serve")) sec.Key("SUBJECT").MustString("Diagnostic message from serve"))
case "database": case "database":
LogConfigs[i] = fmt.Sprintf(`{"level":%s,"driver":"%s","conn":"%s"}`, level, LogConfigs[i] = fmt.Sprintf(`{"level":%s,"driver":"%s","conn":"%s"}`, level,
@ -714,6 +729,7 @@ type Mailer struct {
Name string Name string
Host string Host string
From string From string
FromEmail string
User, Passwd string User, Passwd string
DisableHelo bool DisableHelo bool
HeloHostname string HeloHostname string
@ -749,6 +765,13 @@ func newMailService() {
EnableHTMLAlternative: sec.Key("ENABLE_HTML_ALTERNATIVE").MustBool(), EnableHTMLAlternative: sec.Key("ENABLE_HTML_ALTERNATIVE").MustBool(),
} }
MailService.From = sec.Key("FROM").MustString(MailService.User) MailService.From = sec.Key("FROM").MustString(MailService.User)
parsed, err := mail.ParseAddress(MailService.From)
if err != nil {
log.Fatal(4, "Invalid mailer.FROM (%s): %v", MailService.From, err)
}
MailService.FromEmail = parsed.Address
log.Info("Mail Service Enabled") log.Info("Mail Service Enabled")
} }

10
modules/ssh/ssh.go

@ -110,10 +110,10 @@ func handleServerConn(keyID string, chans <-chan ssh.NewChannel) {
} }
} }
func listen(config *ssh.ServerConfig, port int) { func listen(config *ssh.ServerConfig, host string, port int) {
listener, err := net.Listen("tcp", "0.0.0.0:"+com.ToStr(port)) listener, err := net.Listen("tcp", host+":"+com.ToStr(port))
if err != nil { if err != nil {
panic(err) log.Fatal(4, "Fail to start SSH server: %v", err)
} }
for { for {
// Once a ServerConfig has been configured, connections can be accepted. // Once a ServerConfig has been configured, connections can be accepted.
@ -148,7 +148,7 @@ func listen(config *ssh.ServerConfig, port int) {
} }
// Listen starts a SSH server listens on given port. // Listen starts a SSH server listens on given port.
func Listen(port int) { func Listen(host string, port int) {
config := &ssh.ServerConfig{ config := &ssh.ServerConfig{
PublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) { PublicKeyCallback: func(conn ssh.ConnMetadata, key ssh.PublicKey) (*ssh.Permissions, error) {
pkey, err := models.SearchPublicKeyByContent(strings.TrimSpace(string(ssh.MarshalAuthorizedKey(key)))) pkey, err := models.SearchPublicKeyByContent(strings.TrimSpace(string(ssh.MarshalAuthorizedKey(key))))
@ -180,5 +180,5 @@ func Listen(port int) {
} }
config.AddHostKey(private) config.AddHostKey(private)
go listen(config, port) go listen(config, host, port)
} }

14
modules/sync/status_pool.go

@ -13,7 +13,7 @@ import (
// This table is particularly useful for un/marking and checking values // This table is particularly useful for un/marking and checking values
// in different goroutines. // in different goroutines.
type StatusTable struct { type StatusTable struct {
lock sync.RWMutex sync.RWMutex
pool map[string]bool pool map[string]bool
} }
@ -26,24 +26,24 @@ func NewStatusTable() *StatusTable {
// Start sets value of given name to true in the pool. // Start sets value of given name to true in the pool.
func (p *StatusTable) Start(name string) { func (p *StatusTable) Start(name string) {
p.lock.Lock() p.Lock()
defer p.lock.Unlock() defer p.Unlock()
p.pool[name] = true p.pool[name] = true
} }
// Stop sets value of given name to false in the pool. // Stop sets value of given name to false in the pool.
func (p *StatusTable) Stop(name string) { func (p *StatusTable) Stop(name string) {
p.lock.Lock() p.Lock()
defer p.lock.Unlock() defer p.Unlock()
p.pool[name] = false p.pool[name] = false
} }
// IsRunning checks if value of given name is set to true in the pool. // IsRunning checks if value of given name is set to true in the pool.
func (p *StatusTable) IsRunning(name string) bool { func (p *StatusTable) IsRunning(name string) bool {
p.lock.RLock() p.RLock()
defer p.lock.RUnlock() defer p.RUnlock()
return p.pool[name] return p.pool[name]
} }

4
modules/sync/unique_queue.go

@ -50,12 +50,12 @@ func (q *UniqueQueue) AddFunc(id interface{}, fn func()) {
} }
idStr := com.ToStr(id) idStr := com.ToStr(id)
q.table.lock.Lock() q.table.Lock()
q.table.pool[idStr] = true q.table.pool[idStr] = true
if fn != nil { if fn != nil {
fn() fn()
} }
q.table.lock.Unlock() q.table.Unlock()
q.queue <- idStr q.queue <- idStr
} }

4
modules/template/highlight/highlight.go

@ -61,7 +61,9 @@ var (
} }
// Extensions that are not same as highlight classes. // Extensions that are not same as highlight classes.
highlightMapping = map[string]string{} highlightMapping = map[string]string{
".txt": "nohighlight",
}
) )
func NewContext() { func NewContext() {

8
modules/template/template.go

@ -96,9 +96,7 @@ func NewFuncMap() []template.FuncMap {
"ShortSha": base.ShortSha, "ShortSha": base.ShortSha,
"MD5": base.EncodeMD5, "MD5": base.EncodeMD5,
"ActionContent2Commits": ActionContent2Commits, "ActionContent2Commits": ActionContent2Commits,
"EscapePound": func(str string) string { "EscapePound": EscapePound,
return strings.NewReplacer("%", "%25", "#", "%23", " ", "%20").Replace(str)
},
"RenderCommitMessage": RenderCommitMessage, "RenderCommitMessage": RenderCommitMessage,
"ThemeColorMetaTag": func() string { "ThemeColorMetaTag": func() string {
return setting.UI.ThemeColorMetaTag return setting.UI.ThemeColorMetaTag
@ -268,6 +266,10 @@ func ActionContent2Commits(act Actioner) *models.PushCommits {
return push return push
} }
func EscapePound(str string) string {
return strings.NewReplacer("%", "%25", "#", "%23", " ", "%20", "?", "%3F").Replace(str)
}
func DiffTypeToStr(diffType int) string { func DiffTypeToStr(diffType int) string {
diffTypes := map[int]string{ diffTypes := map[int]string{
1: "add", 2: "modify", 3: "del", 4: "rename", 1: "add", 2: "modify", 3: "del", 4: "rename",

16
public/config.codekit

@ -1,6 +1,6 @@
{ {
"CodeKitInfo": "This is a CodeKit 2.x project configuration file. It is designed to sync project settings across multiple machines. MODIFYING THE CONTENTS OF THIS FILE IS A POOR LIFE DECISION. If you do so, you will likely cause CodeKit to crash. This file is not useful unless accompanied by the project that created it in CodeKit 2. This file is not backwards-compatible with CodeKit 1.x. For more information, see: http:\/\/incident57.com\/codekit", "CodeKitInfo": "This is a CodeKit 2.x project configuration file. It is designed to sync project settings across multiple machines. MODIFYING THE CONTENTS OF THIS FILE IS A POOR LIFE DECISION. If you do so, you will likely cause CodeKit to crash. This file is not useful unless accompanied by the project that created it in CodeKit 2. This file is not backwards-compatible with CodeKit 1.x. For more information, see: http:\/\/incident57.com\/codekit",
"creatorBuild": "19115", "creatorBuild": "19127",
"files": { "files": {
"\/css\/github.min.css": { "\/css\/github.min.css": {
"fileType": 16, "fileType": 16,
@ -20,11 +20,11 @@
"outputPathIsOutsideProject": 0, "outputPathIsOutsideProject": 0,
"outputPathIsSetByUser": 0 "outputPathIsSetByUser": 0
}, },
"\/css\/semantic-2.2.1.min.css": { "\/css\/semantic-2.2.7.min.css": {
"fileType": 16, "fileType": 16,
"ignore": 0, "ignore": 1,
"ignoreWasSetByUser": 0, "ignoreWasSetByUser": 1,
"inputAbbreviatedPath": "\/css\/semantic-2.2.1.min.css", "inputAbbreviatedPath": "\/css\/semantic-2.2.7.min.css",
"outputAbbreviatedPath": "No Output Path", "outputAbbreviatedPath": "No Output Path",
"outputPathIsOutsideProject": 0, "outputPathIsOutsideProject": 0,
"outputPathIsSetByUser": 0 "outputPathIsSetByUser": 0
@ -150,12 +150,12 @@
"outputStyle": 1, "outputStyle": 1,
"syntaxCheckerStyle": 1 "syntaxCheckerStyle": 1
}, },
"\/js\/semantic-2.2.1.min.js": { "\/js\/semantic-2.2.7.min.js": {
"fileType": 64, "fileType": 64,
"ignore": 1, "ignore": 1,
"ignoreWasSetByUser": 1, "ignoreWasSetByUser": 1,
"inputAbbreviatedPath": "\/js\/semantic-2.2.1.min.js", "inputAbbreviatedPath": "\/js\/semantic-2.2.7.min.js",
"outputAbbreviatedPath": "\/js\/min\/semantic-2.2.1.min-min.js", "outputAbbreviatedPath": "\/js\/min\/semantic-2.2.7.min-min.js",
"outputPathIsOutsideProject": 0, "outputPathIsOutsideProject": 0,
"outputPathIsSetByUser": 0, "outputPathIsSetByUser": 0,
"outputStyle": 1, "outputStyle": 1,

31
public/css/gogs.css

@ -908,6 +908,7 @@ footer .ui.language .menu {
padding-top: .6em; padding-top: .6em;
padding-bottom: .6em; padding-bottom: .6em;
display: inline-block; display: inline-block;
word-break: break-all;
} }
.ui.attached.header { .ui.attached.header {
background: #f0f0f0; background: #f0f0f0;
@ -1303,7 +1304,11 @@ footer .ui.language .menu {
max-width: 100%; max-width: 100%;
} }
.repository.file.list #file-content .view-raw img { .repository.file.list #file-content .view-raw img {
padding: 5px 5px 0 5px; margin-bottom: -5px;
}
.repository.file.list #file-content .plain-text {
font-size: 14px;
padding: 10px 15px;
} }
.repository.file.list #file-content .code-view * { .repository.file.list #file-content .code-view * {
font-size: 12px; font-size: 12px;
@ -2157,15 +2162,15 @@ footer .ui.language .menu {
.repository.wiki.view .ui.sub.header { .repository.wiki.view .ui.sub.header {
text-transform: none; text-transform: none;
} }
.repository.wiki.view .markdown { .repository.wiki.view > .markdown {
padding: 15px 30px; padding: 15px 30px;
} }
.repository.wiki.view .markdown h1:first-of-type, .repository.wiki.view > .markdown h1:first-of-type,
.repository.wiki.view .markdown h2:first-of-type, .repository.wiki.view > .markdown h2:first-of-type,
.repository.wiki.view .markdown h3:first-of-type, .repository.wiki.view > .markdown h3:first-of-type,
.repository.wiki.view .markdown h4:first-of-type, .repository.wiki.view > .markdown h4:first-of-type,
.repository.wiki.view .markdown h5:first-of-type, .repository.wiki.view > .markdown h5:first-of-type,
.repository.wiki.view .markdown h6:first-of-type { .repository.wiki.view > .markdown h6:first-of-type {
margin-top: 0; margin-top: 0;
} }
.repository.settings.collaboration .collaborator.list { .repository.settings.collaboration .collaborator.list {
@ -2653,6 +2658,16 @@ footer .ui.language .menu {
.user.settings .email.list .item:not(:first-child) .button { .user.settings .email.list .item:not(:first-child) .button {
margin-top: -10px; margin-top: -10px;
} }
.user.settings .orgs {
padding: 0;
}
.user.settings .orgs .item {
padding: 10px;
}
.user.settings .orgs .item .button {
margin-top: 5px;
margin-right: 8px;
}
.user.profile .ui.card .username { .user.profile .ui.card .username {
display: block; display: block;
} }

11
public/css/semantic-2.2.1.min.css vendored

File diff suppressed because one or more lines are too long

11
public/css/semantic-2.2.7.min.css vendored

File diff suppressed because one or more lines are too long

BIN
public/css/themes/material/assets/fonts/icons.eot

Binary file not shown.

2373
public/css/themes/material/assets/fonts/icons.svg

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 275 KiB

BIN
public/css/themes/material/assets/fonts/icons.ttf

Binary file not shown.

BIN
public/css/themes/material/assets/fonts/icons.woff

Binary file not shown.

2
public/js/gogs.js

@ -1347,7 +1347,7 @@ $(document).ready(function () {
var headers = {}; var headers = {};
$(this).find('h1, h2, h3, h4, h5, h6').each(function () { $(this).find('h1, h2, h3, h4, h5, h6').each(function () {
var node = $(this); var node = $(this);
var val = encodeURIComponent(node.text().toLowerCase().replace(/[^\w\- ]/g, '').replace(/[ ]/g, '-')); var val = encodeURIComponent(node.text().toLowerCase().replace(/[^\u00C0-\u1FFF\u2C00-\uD7FF\w\- ]/g, '').replace(/[ ]/g, '-'));
var name = val; var name = val;
if (headers[val] > 0) { if (headers[val] > 0) {
name = val + '-' + headers[val]; name = val + '-' + headers[val];

19
public/js/semantic-2.2.1.min.js vendored

File diff suppressed because one or more lines are too long

19
public/js/semantic-2.2.7.min.js vendored

File diff suppressed because one or more lines are too long

1
public/less/_form.less

@ -4,6 +4,7 @@
padding-top: .6em; padding-top: .6em;
padding-bottom: .6em; padding-bottom: .6em;
display: inline-block; display: inline-block;
word-break: break-all;
} }
} }
.ui.attached.header { .ui.attached.header {

8
public/less/_repository.less

@ -247,10 +247,14 @@
max-width: 100%; max-width: 100%;
} }
img { img {
padding: 5px 5px 0 5px; margin-bottom: -5px;
} }
} }
.plain-text {
font-size: 14px;
padding: 10px 15px;
}
.code-view { .code-view {
* { * {
font-size: 12px; font-size: 12px;
@ -1154,7 +1158,7 @@
.ui.sub.header { .ui.sub.header {
text-transform: none; text-transform: none;
} }
.markdown { >.markdown {
padding: 15px 30px; padding: 15px 30px;
h1, h2, h3, h4, h5, h6 { h1, h2, h3, h4, h5, h6 {

10
public/less/_user.less

@ -19,6 +19,16 @@
} }
} }
} }
.orgs {
padding: 0;
.item {
padding: 10px;
.button {
margin-top: 5px;
margin-right: 8px;
}
}
}
} }
&.profile { &.profile {

3
routers/admin/admin.go

@ -17,6 +17,7 @@ import (
"github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/context" "github.com/gogits/gogs/modules/context"
"github.com/gogits/gogs/modules/cron" "github.com/gogits/gogs/modules/cron"
"github.com/gogits/gogs/modules/mailer"
"github.com/gogits/gogs/modules/process" "github.com/gogits/gogs/modules/process"
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
) )
@ -177,7 +178,7 @@ func Dashboard(ctx *context.Context) {
func SendTestMail(ctx *context.Context) { func SendTestMail(ctx *context.Context) {
email := ctx.Query("email") email := ctx.Query("email")
// Send a test email to the user's email address and redirect back to Config // Send a test email to the user's email address and redirect back to Config
if err := models.SendTestMail(email); err != nil { if err := mailer.SendTestMail(email); err != nil {
ctx.Flash.Error(ctx.Tr("admin.config.test_mail_failed", email, err)) ctx.Flash.Error(ctx.Tr("admin.config.test_mail_failed", email, err))
} else { } else {
ctx.Flash.Info(ctx.Tr("admin.config.test_mail_sent", email)) ctx.Flash.Info(ctx.Tr("admin.config.test_mail_sent", email))

2
routers/admin/auths.go

@ -228,7 +228,7 @@ func EditAuthSourcePost(ctx *context.Context, form auth.AuthenticationForm) {
ctx.Handle(500, "UpdateSource", err) ctx.Handle(500, "UpdateSource", err)
return return
} }
log.Trace("Authentication changed by admin(%s): %s", ctx.User.Name, source.ID) log.Trace("Authentication changed by admin(%s): %d", ctx.User.Name, source.ID)
ctx.Flash.Success(ctx.Tr("admin.auths.update_success")) ctx.Flash.Success(ctx.Tr("admin.auths.update_success"))
ctx.Redirect(setting.AppSubUrl + "/admin/auths/" + com.ToStr(form.ID)) ctx.Redirect(setting.AppSubUrl + "/admin/auths/" + com.ToStr(form.ID))

11
routers/admin/users.go

@ -14,6 +14,7 @@ import (
"github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/context" "github.com/gogits/gogs/modules/context"
"github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/mailer"
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
"github.com/gogits/gogs/routers" "github.com/gogits/gogs/routers"
) )
@ -116,7 +117,7 @@ func NewUserPost(ctx *context.Context, form auth.AdminCrateUserForm) {
// Send email notification. // Send email notification.
if form.SendNotify && setting.MailService != nil { if form.SendNotify && setting.MailService != nil {
models.SendRegisterNotifyMail(ctx.Context, u) mailer.SendRegisterNotifyMail(ctx.Context, models.NewMailerUser(u))
} }
ctx.Flash.Success(ctx.Tr("admin.users.new_success", u.Name)) ctx.Flash.Success(ctx.Tr("admin.users.new_success", u.Name))
@ -155,6 +156,7 @@ func EditUser(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("admin.users.edit_account") ctx.Data["Title"] = ctx.Tr("admin.users.edit_account")
ctx.Data["PageIsAdmin"] = true ctx.Data["PageIsAdmin"] = true
ctx.Data["PageIsAdminUsers"] = true ctx.Data["PageIsAdminUsers"] = true
ctx.Data["EnableLocalPathMigration"] = setting.Repository.EnableLocalPathMigration
prepareUserInfo(ctx) prepareUserInfo(ctx)
if ctx.Written() { if ctx.Written() {
@ -168,6 +170,7 @@ func EditUserPost(ctx *context.Context, form auth.AdminEditUserForm) {
ctx.Data["Title"] = ctx.Tr("admin.users.edit_account") ctx.Data["Title"] = ctx.Tr("admin.users.edit_account")
ctx.Data["PageIsAdmin"] = true ctx.Data["PageIsAdmin"] = true
ctx.Data["PageIsAdminUsers"] = true ctx.Data["PageIsAdminUsers"] = true
ctx.Data["EnableLocalPathMigration"] = setting.Repository.EnableLocalPathMigration
u := prepareUserInfo(ctx) u := prepareUserInfo(ctx)
if ctx.Written() { if ctx.Written() {
@ -192,7 +195,11 @@ func EditUserPost(ctx *context.Context, form auth.AdminEditUserForm) {
if len(form.Password) > 0 { if len(form.Password) > 0 {
u.Passwd = form.Password u.Passwd = form.Password
u.Salt = models.GetUserSalt() var err error
if u.Salt, err = models.GetUserSalt(); err != nil {
ctx.Handle(500, "UpdateUser", err)
return
}
u.EncodePasswd() u.EncodePasswd()
} }

9
routers/api/v1/admin/user.go

@ -10,6 +10,7 @@ import (
"github.com/gogits/gogs/models" "github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/context" "github.com/gogits/gogs/modules/context"
"github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/mailer"
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
"github.com/gogits/gogs/routers/api/v1/user" "github.com/gogits/gogs/routers/api/v1/user"
) )
@ -65,7 +66,7 @@ func CreateUser(ctx *context.APIContext, form api.CreateUserOption) {
// Send email notification. // Send email notification.
if form.SendNotify && setting.MailService != nil { if form.SendNotify && setting.MailService != nil {
models.SendRegisterNotifyMail(ctx.Context.Context, u) mailer.SendRegisterNotifyMail(ctx.Context.Context, models.NewMailerUser(u))
} }
ctx.JSON(201, u.APIFormat()) ctx.JSON(201, u.APIFormat())
@ -85,7 +86,11 @@ func EditUser(ctx *context.APIContext, form api.EditUserOption) {
if len(form.Password) > 0 { if len(form.Password) > 0 {
u.Passwd = form.Password u.Passwd = form.Password
u.Salt = models.GetUserSalt() var err error
if u.Salt, err = models.GetUserSalt(); err != nil {
ctx.Error(500, "UpdateUser", err)
return
}
u.EncodePasswd() u.EncodePasswd()
} }

8
routers/api/v1/api.go

@ -249,6 +249,7 @@ func RegisterRoutes(m *macaron.Macaron) {
m.Put("/collaborators/:collaborator", bind(api.AddCollaboratorOption{}), repo.AddCollaborator) m.Put("/collaborators/:collaborator", bind(api.AddCollaboratorOption{}), repo.AddCollaborator)
m.Get("/raw/*", context.RepoRef(), repo.GetRawFile) m.Get("/raw/*", context.RepoRef(), repo.GetRawFile)
m.Get("/archive/*", repo.GetArchive) m.Get("/archive/*", repo.GetArchive)
m.Get("/forks", repo.ListForks)
m.Group("/branches", func() { m.Group("/branches", func() {
m.Get("", repo.ListBranches) m.Get("", repo.ListBranches)
m.Get("/:branchname", repo.GetBranch) m.Get("/:branchname", repo.GetBranch)
@ -261,12 +262,17 @@ func RegisterRoutes(m *macaron.Macaron) {
}) })
m.Group("/issues", func() { m.Group("/issues", func() {
m.Combo("").Get(repo.ListIssues).Post(bind(api.CreateIssueOption{}), repo.CreateIssue) m.Combo("").Get(repo.ListIssues).Post(bind(api.CreateIssueOption{}), repo.CreateIssue)
m.Group("/comments", func() {
m.Get("", repo.ListRepoIssueComments)
m.Combo("/:id").Patch(bind(api.EditIssueCommentOption{}), repo.EditIssueComment)
})
m.Group("/:index", func() { m.Group("/:index", func() {
m.Combo("").Get(repo.GetIssue).Patch(bind(api.EditIssueOption{}), repo.EditIssue) m.Combo("").Get(repo.GetIssue).Patch(bind(api.EditIssueOption{}), repo.EditIssue)
m.Group("/comments", func() { m.Group("/comments", func() {
m.Combo("").Get(repo.ListIssueComments).Post(bind(api.CreateIssueCommentOption{}), repo.CreateIssueComment) m.Combo("").Get(repo.ListIssueComments).Post(bind(api.CreateIssueCommentOption{}), repo.CreateIssueComment)
m.Combo("/:id").Patch(bind(api.EditIssueCommentOption{}), repo.EditIssueComment) m.Combo("/:id").Patch(bind(api.EditIssueCommentOption{}), repo.EditIssueComment).
Delete(repo.DeleteIssueComment)
}) })
m.Group("/labels", func() { m.Group("/labels", func() {

5
routers/api/v1/repo/file.go

@ -19,6 +19,11 @@ func GetRawFile(ctx *context.APIContext) {
return return
} }
if ctx.Repo.Repository.IsBare {
ctx.Status(404)
return
}
blob, err := ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreePath) blob, err := ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreePath)
if err != nil { if err != nil {
if git.IsErrNotExist(err) { if git.IsErrNotExist(err) {

2
routers/api/v1/repo/hook.go

@ -166,7 +166,7 @@ func EditHook(ctx *context.APIContext, form api.EditHookOption) {
} }
func DeleteHook(ctx *context.APIContext) { func DeleteHook(ctx *context.APIContext) {
if err := models.DeleteWebhookByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")); err != nil { if err := models.DeleteWebhookOfRepoByID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")); err != nil {
ctx.Error(500, "DeleteWebhookByRepoID", err) ctx.Error(500, "DeleteWebhookByRepoID", err)
return return
} }

47
routers/api/v1/repo/issue_comment.go

@ -38,6 +38,25 @@ func ListIssueComments(ctx *context.APIContext) {
ctx.JSON(200, &apiComments) ctx.JSON(200, &apiComments)
} }
func ListRepoIssueComments(ctx *context.APIContext) {
var since time.Time
if len(ctx.Query("since")) > 0 {
since, _ = time.Parse(time.RFC3339, ctx.Query("since"))
}
comments, err := models.GetCommentsByRepoIDSince(ctx.Repo.Repository.ID, since.Unix())
if err != nil {
ctx.Error(500, "GetCommentsByRepoIDSince", err)
return
}
apiComments := make([]*api.Comment, len(comments))
for i := range comments {
apiComments[i] = comments[i].APIFormat()
}
ctx.JSON(200, &apiComments)
}
func CreateIssueComment(ctx *context.APIContext, form api.CreateIssueCommentOption) { func CreateIssueComment(ctx *context.APIContext, form api.CreateIssueCommentOption) {
issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index")) issue, err := models.GetIssueByIndex(ctx.Repo.Repository.ID, ctx.ParamsInt64(":index"))
if err != nil { if err != nil {
@ -65,7 +84,7 @@ func EditIssueComment(ctx *context.APIContext, form api.EditIssueCommentOption)
return return
} }
if !ctx.IsSigned || (ctx.User.ID != comment.PosterID && !ctx.Repo.IsAdmin()) { if ctx.User.ID != comment.PosterID && !ctx.Repo.IsAdmin() {
ctx.Status(403) ctx.Status(403)
return return
} else if comment.Type != models.COMMENT_TYPE_COMMENT { } else if comment.Type != models.COMMENT_TYPE_COMMENT {
@ -80,3 +99,29 @@ func EditIssueComment(ctx *context.APIContext, form api.EditIssueCommentOption)
} }
ctx.JSON(200, comment.APIFormat()) ctx.JSON(200, comment.APIFormat())
} }
func DeleteIssueComment(ctx *context.APIContext) {
comment, err := models.GetCommentByID(ctx.ParamsInt64(":id"))
if err != nil {
if models.IsErrCommentNotExist(err) {
ctx.Error(404, "GetCommentByID", err)
} else {
ctx.Error(500, "GetCommentByID", err)
}
return
}
if ctx.User.ID != comment.PosterID && !ctx.Repo.IsAdmin() {
ctx.Status(403)
return
} else if comment.Type != models.COMMENT_TYPE_COMMENT {
ctx.Status(204)
return
}
if err = models.DeleteCommentByID(comment.ID); err != nil {
ctx.Error(500, "DeleteCommentByID", err)
return
}
ctx.Status(204)
}

2
routers/api/v1/repo/issue_label.go

@ -85,7 +85,7 @@ func DeleteIssueLabel(ctx *context.APIContext) {
return return
} }
label, err := models.GetLabelInRepoByID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")) label, err := models.GetLabelOfRepoByID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id"))
if err != nil { if err != nil {
if models.IsErrLabelNotExist(err) { if models.IsErrLabelNotExist(err) {
ctx.Error(422, "", err) ctx.Error(422, "", err)

8
routers/api/v1/repo/label.go

@ -32,11 +32,11 @@ func GetLabel(ctx *context.APIContext) {
label *models.Label label *models.Label
err error err error
) )
strID := ctx.Params(":id") strID := ctx.ParamsInt64(":id")
if intID, err2 := strconv.ParseInt(strID, 10, 64); err2 != nil { if intID, err2 := strconv.ParseInt(strID, 10, 64); err2 != nil {
label, err = models.GetLabelInRepoByName(ctx.Repo.Repository.ID, strID) label, err = models.GetLabelOfRepoByName(ctx.Repo.Repository.ID, strID)
} else { } else {
label, err = models.GetLabelInRepoByID(ctx.Repo.Repository.ID, intID) label, err = models.GetLabelOfRepoByID(ctx.Repo.Repository.ID, intID)
} }
if err != nil { if err != nil {
if models.IsErrLabelNotExist(err) { if models.IsErrLabelNotExist(err) {
@ -74,7 +74,7 @@ func EditLabel(ctx *context.APIContext, form api.EditLabelOption) {
return return
} }
label, err := models.GetLabelInRepoByID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")) label, err := models.GetLabelOfRepoByID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id"))
if err != nil { if err != nil {
if models.IsErrLabelNotExist(err) { if models.IsErrLabelNotExist(err) {
ctx.Status(404) ctx.Status(404)

2
routers/api/v1/repo/milestone.go

@ -89,7 +89,7 @@ func EditMilestone(ctx *context.APIContext, form api.EditMilestoneOption) {
} }
func DeleteMilestone(ctx *context.APIContext) { func DeleteMilestone(ctx *context.APIContext) {
if err := models.DeleteMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")); err != nil { if err := models.DeleteMilestoneOfRepoByID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")); err != nil {
ctx.Error(500, "DeleteMilestoneByRepoID", err) ctx.Error(500, "DeleteMilestoneByRepoID", err)
return return
} }

30
routers/api/v1/repo/repo.go

@ -78,7 +78,12 @@ func Search(ctx *context.APIContext) {
// https://github.com/gogits/go-gogs-client/wiki/Repositories#list-your-repositories // https://github.com/gogits/go-gogs-client/wiki/Repositories#list-your-repositories
func ListMyRepos(ctx *context.APIContext) { func ListMyRepos(ctx *context.APIContext) {
ownRepos, err := models.GetUserRepositories(ctx.User.ID, true, 1, ctx.User.NumRepos) ownRepos, err := models.GetUserRepositories(&models.UserRepoOptions{
UserID: ctx.User.ID,
Private: true,
Page: 1,
PageSize: ctx.User.NumRepos,
})
if err != nil { if err != nil {
ctx.Error(500, "GetRepositories", err) ctx.Error(500, "GetRepositories", err)
return return
@ -306,3 +311,26 @@ func Delete(ctx *context.APIContext) {
log.Trace("Repository deleted: %s/%s", owner.Name, repo.Name) log.Trace("Repository deleted: %s/%s", owner.Name, repo.Name)
ctx.Status(204) ctx.Status(204)
} }
func ListForks(ctx *context.APIContext) {
forks, err := ctx.Repo.Repository.GetForks()
if err != nil {
ctx.Error(500, "GetForks", err)
return
}
apiForks := make([]*api.Repository, len(forks))
for i := range forks {
if err := forks[i].GetOwner(); err != nil {
ctx.Error(500, "GetOwner", err)
return
}
apiForks[i] = forks[i].APIFormat(&api.Permission{
Admin: ctx.User.IsAdminOfRepo(forks[i]),
Push: ctx.User.IsWriterOfRepo(forks[i]),
Pull: true,
})
}
ctx.JSON(200, &apiForks)
}

1
routers/api/v1/user/email.go

@ -69,6 +69,7 @@ func DeleteEmail(ctx *context.APIContext, form api.CreateEmailOption) {
emails := make([]*models.EmailAddress, len(form.Emails)) emails := make([]*models.EmailAddress, len(form.Emails))
for i := range form.Emails { for i := range form.Emails {
emails[i] = &models.EmailAddress{ emails[i] = &models.EmailAddress{
UID: ctx.User.ID,
Email: form.Emails[i], Email: form.Emails[i],
} }
} }

17
routers/install.go

@ -38,12 +38,10 @@ const (
) )
func checkRunMode() { func checkRunMode() {
switch setting.Cfg.Section("").Key("RUN_MODE").String() { if setting.ProdMode {
case "prod":
macaron.Env = macaron.PROD macaron.Env = macaron.PROD
macaron.ColorLog = false macaron.ColorLog = false
setting.ProdMode = true } else {
default:
git.Debug = true git.Debug = true
} }
log.Info("Run Mode: %s", strings.Title(macaron.Env)) log.Info("Run Mode: %s", strings.Title(macaron.Env))
@ -92,8 +90,8 @@ func GlobalInit() {
checkRunMode() checkRunMode()
if setting.InstallLock && setting.SSH.StartBuiltinServer { if setting.InstallLock && setting.SSH.StartBuiltinServer {
ssh.Listen(setting.SSH.ListenPort) ssh.Listen(setting.SSH.ListenHost, setting.SSH.ListenPort)
log.Info("SSH server started on :%v", setting.SSH.ListenPort) log.Info("SSH server started on %s:%v", setting.SSH.ListenHost, setting.SSH.ListenPort)
} }
} }
@ -343,7 +341,12 @@ func InstallPost(ctx *context.Context, form auth.InstallForm) {
cfg.Section("log").Key("ROOT_PATH").SetValue(form.LogRootPath) cfg.Section("log").Key("ROOT_PATH").SetValue(form.LogRootPath)
cfg.Section("security").Key("INSTALL_LOCK").SetValue("true") cfg.Section("security").Key("INSTALL_LOCK").SetValue("true")
cfg.Section("security").Key("SECRET_KEY").SetValue(base.GetRandomString(15)) secretKey, err := base.GetRandomString(15)
if err != nil {
ctx.RenderWithErr(ctx.Tr("install.secret_key_failed", err), INSTALL, &form)
return
}
cfg.Section("security").Key("SECRET_KEY").SetValue(secretKey)
os.MkdirAll(filepath.Dir(setting.CustomConf), os.ModePerm) os.MkdirAll(filepath.Dir(setting.CustomConf), os.ModePerm)
if err := cfg.SaveTo(setting.CustomConf); err != nil { if err := cfg.SaveTo(setting.CustomConf); err != nil {

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save