Compare commits

...

10 Commits

Author SHA1 Message Date
Jimmy Praet fcc11253ac
Add archived label for code search results in archived repo's (#17817)
* Add archived label for code search results in archived repo's

* Remove trailing whitespace

Co-authored-by: Lauris BH <lauris@nix.lv>
2021-11-26 16:49:31 +08:00
Lunny Xiao 371ebce252
Fix database inconsistent when admin change user email (#17549) 2021-11-25 20:56:16 -05:00
GiteaBot f23851f690 [skip ci] Updated translations via Crowdin 2021-11-26 00:25:09 +00:00
Lunny Xiao 6c21961462
org settings -> webhook/labels/deletion should also active the menu (#17809) 2021-11-25 23:15:58 +08:00
KN4CK3R e8f1f09132
Fixed org styles. (#17807)
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
2021-11-25 21:05:04 +08:00
wxiaoguang edd37e9d4a
Fix org webchatwork webhook (#17810) 2021-11-25 04:25:25 -05:00
ThetaDev af901a4ca9
Detect dark theme via css variable (#17800)
* detect dark theme via css variable
* minor refactor, add documentation

If your custom theme is considered a dark theme, set the global css variable `--is-dark-theme` to `true`.
This allows gitea to adjust the Monaco code editor's theme accordingly.
2021-11-25 15:14:48 +08:00
qwerty287 e0f81b4ef4
Allow forks to org if you can create repos (#17783) 2021-11-25 13:03:03 +08:00
Gusted 4b4997c73e
Use correct user on releases (#17806)
- Use the provided `doer` instead of `rel.Publisher`. The code will also
run on edited releases and deleted ones, which isn't necessary done by
`rel.Publisher`.

Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
2021-11-25 12:17:16 +08:00
GiteaBot 4f99697888 [skip ci] Updated translations via Crowdin 2021-11-25 00:25:19 +00:00
23 changed files with 429 additions and 287 deletions

View File

@ -337,6 +337,9 @@ Community themes are listed in [gitea/awesome-gitea#themes](https://gitea.com/gi
The `arc-green` theme source can be found [here](https://github.com/go-gitea/gitea/blob/main/web_src/less/themes/theme-arc-green.less). The `arc-green` theme source can be found [here](https://github.com/go-gitea/gitea/blob/main/web_src/less/themes/theme-arc-green.less).
If your custom theme is considered a dark theme, set the global css variable `--is-dark-theme` to `true`.
This allows gitea to adjust the Monaco code editor's theme accordingly.
## Customizing fonts ## Customizing fonts
Fonts can be customized using CSS variables: Fonts can be customized using CSS variables:

View File

@ -766,7 +766,7 @@ func CanUserForkRepo(user *user_model.User, repo *Repository) (bool, error) {
if repo.OwnerID != user.ID && !HasForkedRepo(user.ID, repo.ID) { if repo.OwnerID != user.ID && !HasForkedRepo(user.ID, repo.ID) {
return true, nil return true, nil
} }
ownedOrgs, err := GetOwnedOrgsByUserID(user.ID) ownedOrgs, err := GetOrgsCanCreateRepoByUserID(user.ID)
if err != nil { if err != nil {
return false, err return false, err
} }

View File

@ -796,18 +796,48 @@ func validateUser(u *User) error {
return ValidateEmail(u.Email) return ValidateEmail(u.Email)
} }
func updateUser(e db.Engine, u *User) error { func updateUser(ctx context.Context, u *User, changePrimaryEmail bool) error {
if err := validateUser(u); err != nil { if err := validateUser(u); err != nil {
return err return err
} }
e := db.GetEngine(ctx)
if changePrimaryEmail {
var emailAddress EmailAddress
has, err := e.Where("lower_email=?", strings.ToLower(u.Email)).Get(&emailAddress)
if err != nil {
return err
}
if !has {
// 1. Update old primary email
if _, err = e.Where("uid=? AND is_primary=?", u.ID, true).Cols("is_primary").Update(&EmailAddress{
IsPrimary: false,
}); err != nil {
return err
}
emailAddress.Email = u.Email
emailAddress.UID = u.ID
emailAddress.IsActivated = true
emailAddress.IsPrimary = true
if _, err := e.Insert(&emailAddress); err != nil {
return err
}
} else if _, err := e.ID(emailAddress).Cols("is_primary").Update(&EmailAddress{
IsPrimary: true,
}); err != nil {
return err
}
}
_, err := e.ID(u.ID).AllCols().Update(u) _, err := e.ID(u.ID).AllCols().Update(u)
return err return err
} }
// UpdateUser updates user's information. // UpdateUser updates user's information.
func UpdateUser(u *User) error { func UpdateUser(u *User, emailChanged bool) error {
return updateUser(db.GetEngine(db.DefaultContext), u) return updateUser(db.DefaultContext, u, emailChanged)
} }
// UpdateUserCols update user according special columns // UpdateUserCols update user according special columns
@ -836,14 +866,13 @@ func UpdateUserSetting(u *User) (err error) {
return err return err
} }
defer committer.Close() defer committer.Close()
sess := db.GetEngine(ctx)
if !u.IsOrganization() { if !u.IsOrganization() {
if err = checkDupEmail(sess, u); err != nil { if err = checkDupEmail(db.GetEngine(ctx), u); err != nil {
return err return err
} }
} }
if err = updateUser(sess, u); err != nil { if err = updateUser(ctx, u, false); err != nil {
return err return err
} }
return committer.Commit() return committer.Commit()

View File

@ -273,19 +273,19 @@ func TestUpdateUser(t *testing.T) {
user := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) user := unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
user.KeepActivityPrivate = true user.KeepActivityPrivate = true
assert.NoError(t, UpdateUser(user)) assert.NoError(t, UpdateUser(user, false))
user = unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) user = unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
assert.True(t, user.KeepActivityPrivate) assert.True(t, user.KeepActivityPrivate)
setting.Service.AllowedUserVisibilityModesSlice = []bool{true, false, false} setting.Service.AllowedUserVisibilityModesSlice = []bool{true, false, false}
user.KeepActivityPrivate = false user.KeepActivityPrivate = false
user.Visibility = structs.VisibleTypePrivate user.Visibility = structs.VisibleTypePrivate
assert.Error(t, UpdateUser(user)) assert.Error(t, UpdateUser(user, false))
user = unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) user = unittest.AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
assert.True(t, user.KeepActivityPrivate) assert.True(t, user.KeepActivityPrivate)
user.Email = "no mail@mail.org" user.Email = "no mail@mail.org"
assert.Error(t, UpdateUser(user)) assert.Error(t, UpdateUser(user, true))
} }
func TestNewUserRedirect(t *testing.T) { func TestNewUserRedirect(t *testing.T) {

View File

@ -769,12 +769,12 @@ func sendReleaseHook(doer *user_model.User, rel *models.Release, action api.Hook
return return
} }
mode, _ := models.AccessLevel(rel.Publisher, rel.Repo) mode, _ := models.AccessLevel(doer, rel.Repo)
if err := webhook_services.PrepareWebhooks(rel.Repo, webhook.HookEventRelease, &api.ReleasePayload{ if err := webhook_services.PrepareWebhooks(rel.Repo, webhook.HookEventRelease, &api.ReleasePayload{
Action: action, Action: action,
Release: convert.ToRelease(rel), Release: convert.ToRelease(rel),
Repository: convert.ToRepo(rel.Repo, mode), Repository: convert.ToRepo(rel.Repo, mode),
Sender: convert.ToUser(rel.Publisher, nil), Sender: convert.ToUser(doer, nil),
}); err != nil { }); err != nil {
log.Error("PrepareWebhooks: %v", err) log.Error("PrepareWebhooks: %v", err)
} }

View File

@ -899,6 +899,7 @@ migrate.clone_address_desc=既存リポジトリの、HTTP(S)またはGit形式
migrate.github_token_desc=Github APIはレート制限がありますが、移行をより速くするため、ここにカンマ区切りで複数のトークンを入力することができます。 警告: この機能を悪用すると、サービスプロバイダのポリシーに違反し、アカウントがブロックされる可能性があります。 migrate.github_token_desc=Github APIはレート制限がありますが、移行をより速くするため、ここにカンマ区切りで複数のトークンを入力することができます。 警告: この機能を悪用すると、サービスプロバイダのポリシーに違反し、アカウントがブロックされる可能性があります。
migrate.clone_local_path=、またはローカルサーバー上のパス migrate.clone_local_path=、またはローカルサーバー上のパス
migrate.permission_denied=ローカルリポジトリをインポートする権限がありません。 migrate.permission_denied=ローカルリポジトリをインポートする権限がありません。
migrate.permission_denied_blocked=許可されていないホストからインポートできません。管理者に問い合わせて、ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS の設定を確認してください。
migrate.invalid_local_path=ローカルパスが無効です。 存在しないかディレクトリではありません。 migrate.invalid_local_path=ローカルパスが無効です。 存在しないかディレクトリではありません。
migrate.invalid_lfs_endpoint=LFS エンドポイントが無効です。 migrate.invalid_lfs_endpoint=LFS エンドポイントが無効です。
migrate.failed=移行に失敗しました: %v migrate.failed=移行に失敗しました: %v
@ -945,6 +946,7 @@ clone_this_repo=このリポジトリのクローンを作成
create_new_repo_command=コマンドラインから新しいリポジトリを作成 create_new_repo_command=コマンドラインから新しいリポジトリを作成
push_exist_repo=コマンドラインから既存のリポジトリをプッシュ push_exist_repo=コマンドラインから既存のリポジトリをプッシュ
empty_message=このリポジトリの中には何もありません。 empty_message=このリポジトリの中には何もありません。
broken_message=このリポジトリの基礎となる git のデータを読み取れません。このインスタンスの管理者に相談するか、このリポジトリを削除してください。
code=コード code=コード
code.desc=ソースコード、ファイル、コミット、ブランチにアクセス。 code.desc=ソースコード、ファイル、コミット、ブランチにアクセス。
@ -1170,6 +1172,9 @@ issues.add_assignee_at=`を <b>%[1]s</b> が担当者に指名 %[2]s`
issues.remove_assignee_at=`を <b>%[1]s</b> が担当から解除 %[2]s` issues.remove_assignee_at=`を <b>%[1]s</b> が担当から解除 %[2]s`
issues.remove_self_assignment=`が自身を担当から解除 %s` issues.remove_self_assignment=`が自身を担当から解除 %s`
issues.change_title_at=`がタイトルを <b><strike>%[1]s</strike></b> から <b>%[2]s</b> に変更 %[3]s` issues.change_title_at=`がタイトルを <b><strike>%[1]s</strike></b> から <b>%[2]s</b> に変更 %[3]s`
issues.change_ref_at=`が参照を <b><strike>%s</strike></b> から <b>%s</b> に変更 %s`
issues.remove_ref_at=`が参照 <b>%s</b> を削除 %s`
issues.add_ref_at=`が参照 <b>%s</b> を追加 %s`
issues.delete_branch_at=`がブランチ <b>%[1]s</b> を削除 %[2]s` issues.delete_branch_at=`がブランチ <b>%[1]s</b> を削除 %[2]s`
issues.open_tab=%d件 オープン中 issues.open_tab=%d件 オープン中
issues.close_tab=%d件 クローズ済 issues.close_tab=%d件 クローズ済
@ -2038,6 +2043,7 @@ diff.file_suppressed=ファイル差分が大きすぎるため省略します
diff.file_suppressed_line_too_long=長すぎる行があるためファイル差分は表示されません diff.file_suppressed_line_too_long=長すぎる行があるためファイル差分は表示されません
diff.too_many_files=変更されたファイルが多すぎるため、一部のファイルは表示されません diff.too_many_files=変更されたファイルが多すぎるため、一部のファイルは表示されません
diff.show_more=さらに表示 diff.show_more=さらに表示
diff.load=差分を読み込み
diff.generated=generated diff.generated=generated
diff.vendored=vendored diff.vendored=vendored
diff.comment.placeholder=コメントを残す diff.comment.placeholder=コメントを残す

View File

@ -898,6 +898,7 @@ migrate.clone_address_desc=O URL de clonagem HTTP(S) ou Git de um repositório e
migrate.github_token_desc=Pode colocar aqui um ou mais códigos separados por vírgulas para tornar mais rápida a migração, para compensar a limitação de velocidade da API do GitHub. AVISO: O abuso desta funcionalidade poderá violar a política do seu fornecedor de serviço e levar ao bloqueio da conta. migrate.github_token_desc=Pode colocar aqui um ou mais códigos separados por vírgulas para tornar mais rápida a migração, para compensar a limitação de velocidade da API do GitHub. AVISO: O abuso desta funcionalidade poderá violar a política do seu fornecedor de serviço e levar ao bloqueio da conta.
migrate.clone_local_path=ou um caminho no servidor local migrate.clone_local_path=ou um caminho no servidor local
migrate.permission_denied=Não está autorizado a importar repositórios locais. migrate.permission_denied=Não está autorizado a importar repositórios locais.
migrate.permission_denied_blocked=Não pode importar de servidores não permitidos, por favor peça ao administrador para verificar as configurações ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS.
migrate.invalid_local_path=O caminho local é inválido. Não existe ou não é uma pasta. migrate.invalid_local_path=O caminho local é inválido. Não existe ou não é uma pasta.
migrate.invalid_lfs_endpoint=O destino LFS não é válido. migrate.invalid_lfs_endpoint=O destino LFS não é válido.
migrate.failed=A migração falhou: %v migrate.failed=A migração falhou: %v
@ -944,6 +945,7 @@ clone_this_repo=Clonar este repositório
create_new_repo_command=Criando um novo repositório na linha de comandos create_new_repo_command=Criando um novo repositório na linha de comandos
push_exist_repo=Enviando, pela linha de comandos, um repositório existente push_exist_repo=Enviando, pela linha de comandos, um repositório existente
empty_message=Este repositório não contém qualquer conteúdo. empty_message=Este repositório não contém qualquer conteúdo.
broken_message=Os dados git subjacentes a este repositório não podem ser lidos. Contacte o administrador desta instância ou elimine este repositório.
code=Código code=Código
code.desc=Aceder ao código fonte, ficheiros, cometimentos e ramos. code.desc=Aceder ao código fonte, ficheiros, cometimentos e ramos.
@ -2034,6 +2036,7 @@ diff.file_suppressed=A apresentação das diferenças no ficheiro foi suprimida
diff.file_suppressed_line_too_long=A apresentação das diferenças entre ficheiros foi suprimida porque há linhas demasiado longas diff.file_suppressed_line_too_long=A apresentação das diferenças entre ficheiros foi suprimida porque há linhas demasiado longas
diff.too_many_files=Alguns ficheiros não foram mostrados porque foram modificados demasiados ficheiros neste diff diff.too_many_files=Alguns ficheiros não foram mostrados porque foram modificados demasiados ficheiros neste diff
diff.show_more=Mostrar mais diff.show_more=Mostrar mais
diff.load=Carregar diff
diff.comment.placeholder=Deixar um comentário diff.comment.placeholder=Deixar um comentário
diff.comment.markdown_info=A formatação com markdown é suportada. diff.comment.markdown_info=A formatação com markdown é suportada.
diff.comment.add_single_comment=Adicionar um único comentário diff.comment.add_single_comment=Adicionar um único comentário

View File

@ -72,7 +72,7 @@ collaborative=Совместные
forks=Форки forks=Форки
activities=Активность activities=Активность
pull_requests=Pull Request'ы pull_requests=Запросы на слияние
issues=Задачи issues=Задачи
milestones=Этапы milestones=Этапы
@ -85,6 +85,11 @@ remove=Удалить
remove_all=Удалить все remove_all=Удалить все
edit=Изменить edit=Изменить
copy=Скопировать
copy_url=Копировать URL
copy_branch=Скопировать имя ветки
copy_success=Скопировано!
copy_error=Ошибка при копировании
write=Редактирование write=Редактирование
preview=Предпросмотр preview=Предпросмотр
@ -94,7 +99,7 @@ step1=Шаг 1:
step2=Шаг 2: step2=Шаг 2:
error=Ошибка error=Ошибка
error404=Страница, которую вы пытаетесь открыть, либо <strong>не существует</strong>, либо <strong>вы не авторизованы</strong> для ее просмотра. error404=Страница, которую вы пытаетесь открыть, либо <strong>не существует</strong>, либо <strong>недостаточно прав</strong> для ее просмотра.
never=Никогда never=Никогда
@ -128,7 +133,7 @@ password=Пароль
db_name=Имя базы данных db_name=Имя базы данных
db_helper=Для пользователей MySQL: пожалуйста, используйте движок InnoDB, и если вы используете "utf8mb4" - ваша версия InnoDB должна быть старше 5.6 . db_helper=Для пользователей MySQL: пожалуйста, используйте движок InnoDB, и если вы используете "utf8mb4" - ваша версия InnoDB должна быть старше 5.6 .
db_schema=Схема db_schema=Схема
db_schema_helper=Оставьте пустым для базы данных по умолчанию ("public"). db_schema_helper=Оставьте пустым для значения по умолчанию ("public").
ssl_mode=SSL ssl_mode=SSL
charset=Кодировка charset=Кодировка
path=Путь path=Путь
@ -144,12 +149,14 @@ err_admin_name_is_invalid=Неверное имя администратора
general_title=Основные настройки general_title=Основные настройки
app_name=Название сайта app_name=Название сайта
app_name_helper=Здесь вы можете ввести название своей компании. app_name_helper=Здесь вы можете ввести название своей компании.
repo_path=Путь корня репозитория repo_path=Путь до корня репозитория
repo_path_helper=Все удалённые Git репозитории будут сохранены в этот каталог. repo_path_helper=Все удалённые Git репозитории будут сохранены в эту директорию.
lfs_path=Корневой путь Git LFS lfs_path=Корневой путь Git LFS
lfs_path_helper=В этой папке будут храниться файлы Git LFS. Оставьте пустым, чтобы отключить LFS. lfs_path_helper=В этой директории будут храниться файлы Git LFS. Оставьте пустым, чтобы отключить LFS.
run_user=Запуск от имени пользователя run_user=Запуск от имени пользователя
run_user_helper=Введите имя пользователя операционной системы, под которым работает Gitea. Обратите внимание, что этот пользователь должен иметь доступ к корневому пути репозиториев. run_user_helper=Введите имя пользователя операционной системы, под которым работает Gitea. Обратите внимание, что этот пользователь должен иметь доступ к корневому пути репозиториев.
domain=Домен сервера
domain_helper=Домен или адрес хоста для сервера.
ssh_port=Порт SSH сервера ssh_port=Порт SSH сервера
ssh_port_helper=Номер порта, который использует SSH сервер. Оставьте пустым, чтобы отключить SSH. ssh_port_helper=Номер порта, который использует SSH сервер. Оставьте пустым, чтобы отключить SSH.
http_port=Gitea HTTP порт http_port=Gitea HTTP порт
@ -176,11 +183,11 @@ disable_gravatar_popup=Отключить Gravatar и сторонние ист
federated_avatar_lookup=Включить федеративные аватары federated_avatar_lookup=Включить федеративные аватары
federated_avatar_lookup_popup=Включите поиск федеративного аватара для использования службы с открытым исходным кодом на основе libravatar. federated_avatar_lookup_popup=Включите поиск федеративного аватара для использования службы с открытым исходным кодом на основе libravatar.
disable_registration=Отключить самостоятельную регистрацию disable_registration=Отключить самостоятельную регистрацию
disable_registration_popup=Запретить самостоятельную регистрацию. Только администраторы смогут создавать новые учетные записи пользователей. disable_registration_popup=Отключить самостоятельную регистрацию. Только администраторы смогут создавать новые учетные записи пользователей.
allow_only_external_registration_popup=Разрешить регистрацию только через сторонние сервисы allow_only_external_registration_popup=Разрешить регистрацию только через сторонние сервисы
openid_signin=Включение входа через OpenID openid_signin=Включить вход через OpenID
openid_signin_popup=Включение входа через OpenID. openid_signin_popup=Включить вход через OpenID.
openid_signup=Включить саморегистрацию OpenID openid_signup=Включить регистрацию через OpenID
openid_signup_popup=Включить саморегистрацию OpenID. openid_signup_popup=Включить саморегистрацию OpenID.
enable_captcha=Включить CAPTCHA при регистрации enable_captcha=Включить CAPTCHA при регистрации
enable_captcha_popup=Запрашивать капчу при регистрации пользователя. enable_captcha_popup=Запрашивать капчу при регистрации пользователя.
@ -195,18 +202,18 @@ admin_email=Адрес эл. почты
install_btn_confirm=Установить Gitea install_btn_confirm=Установить Gitea
test_git_failed=Не удалось проверить 'git' команду: %v test_git_failed=Не удалось проверить 'git' команду: %v
sqlite3_not_available=Эта версия Gitea не поддерживает SQLite3. Пожалуйста, загрузите официальную бинарную версию из %s (не 'go build' версия). sqlite3_not_available=Эта версия Gitea не поддерживает SQLite3. Пожалуйста, загрузите официальную бинарную версию из %s (не 'go build' версия).
invalid_db_setting=Недопустимые параметры настройки базы данных: %v invalid_db_setting=Некорректные настройки базы данных: %v
invalid_repo_path=Недопустимый путь к корню репозитория: %v invalid_repo_path=Недопустимый путь к корню репозитория: %v
run_user_not_match=Текущий пользователь не является пользователем для запуска: %s -> %s run_user_not_match=Текущий пользователь не является пользователем для запуска: %s -> %s
save_config_failed=Не удалось сохранить конфигурацию: %v save_config_failed=Не удалось сохранить конфигурацию: %v
invalid_admin_setting=Указан недопустимый параметр учетной записи администратора: %v invalid_admin_setting=Некорректные настройки учётной записи администратора: %v
install_success=Добро пожаловать! Благодарим вас за выбор Gitea, пользуйтесь с удовольствием! install_success=Добро пожаловать! Благодарим вас за выбор Gitea, пользуйтесь с удовольствием!
invalid_log_root_path=Недопустимый путь для логов: %v invalid_log_root_path=Недопустимый путь для логов: %v
default_keep_email_private=Скрывать адреса электронной почты по умолчанию default_keep_email_private=Скрывать адреса электронной почты по умолчанию
default_keep_email_private_popup=Скрывать адреса электронной почты новых учетных записей по умолчанию. default_keep_email_private_popup=Скрывать адреса электронной почты новых учетных записей по умолчанию.
default_allow_create_organization=Разрешить создание организаций по умолчанию default_allow_create_organization=Разрешить создание организаций по умолчанию
default_allow_create_organization_popup=Разрешить новым учетным записям пользователей создавать организации по умолчанию. default_allow_create_organization_popup=Разрешить новым учетным записям пользователей создавать организации по умолчанию.
default_enable_timetracking=Включение отслеживания времени по умолчанию default_enable_timetracking=Включить отслеживание времени по умолчанию
default_enable_timetracking_popup=Включить отслеживание времени для новых репозиториев по умолчанию. default_enable_timetracking_popup=Включить отслеживание времени для новых репозиториев по умолчанию.
no_reply_address=Скрытый почтовый домен no_reply_address=Скрытый почтовый домен
no_reply_address_helper=Доменное имя для пользователей со скрытым адресом электронной почты. Например, имя пользователя 'joe' будет зарегистрировано в Git как 'joe@noreply.example.org' если скрытый домен электронной почты установлен как 'noreply.example.org'. no_reply_address_helper=Доменное имя для пользователей со скрытым адресом электронной почты. Например, имя пользователя 'joe' будет зарегистрировано в Git как 'joe@noreply.example.org' если скрытый домен электронной почты установлен как 'noreply.example.org'.
@ -226,6 +233,7 @@ view_home=Показать %s
search_repos=Поиск репозитория… search_repos=Поиск репозитория…
filter=Другие фильтры filter=Другие фильтры
filter_by_team_repositories=Фильтровать по репозиториям команды filter_by_team_repositories=Фильтровать по репозиториям команды
feed_of=Лента "%s"
show_archived=Архивировано show_archived=Архивировано
show_both_archived_unarchived=Показаны архивированные и разархивированные show_both_archived_unarchived=Показаны архивированные и разархивированные
@ -261,7 +269,7 @@ social_register_helper_msg=Уже есть аккаунт? Свяжите его
disable_register_prompt=Извините, возможность регистрации отключена. Пожалуйста, свяжитесь с администратором сайта. disable_register_prompt=Извините, возможность регистрации отключена. Пожалуйста, свяжитесь с администратором сайта.
disable_register_mail=Подтверждение регистрации по электронной почте отключено. disable_register_mail=Подтверждение регистрации по электронной почте отключено.
remember_me=Запомнить это устройство remember_me=Запомнить это устройство
forgot_password_title=Забыл пароль forgot_password_title=Восстановить пароль
forgot_password=Забыли пароль? forgot_password=Забыли пароль?
sign_up_now=Нужен аккаунт? Зарегистрируйтесь. sign_up_now=Нужен аккаунт? Зарегистрируйтесь.
sign_up_successful=Учётная запись была успешно создана. sign_up_successful=Учётная запись была успешно создана.
@ -279,10 +287,10 @@ resend_mail=Нажмите здесь, чтобы переотправить а
email_not_associate=Этот адрес электронной почты не связан ни с одной учетной записью. email_not_associate=Этот адрес электронной почты не связан ни с одной учетной записью.
send_reset_mail=Отправить письмо для восстановления аккаунта send_reset_mail=Отправить письмо для восстановления аккаунта
reset_password=Восстановление аккаунта reset_password=Восстановление аккаунта
invalid_code=Этот код подтверждения недействителен или истек. invalid_code=Код подтверждения недействителен или истёк.
reset_password_helper=Восстановить аккаунт reset_password_helper=Восстановить аккаунт
reset_password_wrong_user=Вы вошли как %s, но ссылка для восстановления аккаунта %s reset_password_wrong_user=Вы вошли как %s, но ссылка для восстановления аккаунта %s
password_too_short=Длина пароля не может быть меньше, чем %d символов. password_too_short=Пароль не может быть короче %d символов.
non_local_account=Нелокальные аккаунты не могут изменить пароль через Gitea. non_local_account=Нелокальные аккаунты не могут изменить пароль через Gitea.
verify=Проверить verify=Проверить
scratch_code=Одноразовый пароль scratch_code=Одноразовый пароль
@ -344,26 +352,26 @@ reset_password.text=Пожалуйста, перейдите по ссылке,
register_success=Регистрация прошла успешно register_success=Регистрация прошла успешно
issue_assigned.pull=@%[1]s назначил вам запрос на слияние %[2]s в репозитории %[3]s. issue_assigned.pull=@%[1]s назначил(а) вам запрос на слияние %[2]s в репозитории %[3]s.
issue_assigned.issue=@%[1]s назначил вам задачу %[2]s в репозитории %[3]s. issue_assigned.issue=@%[1]s назначил(а) вам задачу %[2]s в репозитории %[3]s.
issue.x_mentioned_you=<b>@%s</b> упомянул вас: issue.x_mentioned_you=<b>@%s</b> упомянул(а) вас:
issue.action.force_push=<b>%[1]s</b> форсировал отправку изменений <b>%[2]s</b> с %[3]s до %[4]s. issue.action.force_push=<b>%[1]s</b> форсировал(а) отправку изменений <b>%[2]s</b> с %[3]s до %[4]s.
issue.action.push_1=<b>@%[1]s</b> отправил %[3]d изменение %[2]s issue.action.push_1=<b>@%[1]s</b> отправил(а) %[3]d изменение в %[2]s
issue.action.push_n=<b>@%[1]s</b> отправил %[3]d изменений %[2]s issue.action.push_n=<b>@%[1]s</b> отправил(а) %[3]d изменений в %[2]s
issue.action.close=<b>@%[1]s</b> закрыты #%[2]d. issue.action.close=<b>@%[1]s</b> закрыл(а) #%[2]d.
issue.action.reopen=<b>@%[1]s</b> переоткрыты #%[2]d. issue.action.reopen=<b>@%[1]s</b> переоткрыл(а) #%[2]d.
issue.action.merge=<b>@%[1]s</b> слиты #%[2]d в %[3]s. issue.action.merge=<b>@%[1]s</b> слил(а) #%[2]d в %[3]s.
issue.action.approve=<b>@%[1]s</b> одобрил этот запрос на слияние. issue.action.approve=<b>@%[1]s</b> одобрил(а) этот запрос на слияние.
issue.action.reject=<b>@%[1]s</b> запросил изменения в этом запросе на слияние. issue.action.reject=<b>@%[1]s</b> запросил(а) изменения в этом запросе на слияние.
issue.action.review=<b>@%[1]s</b> прокомментировал этот запрос на слияние. issue.action.review=<b>@%[1]s</b> прокомментировал(а) этот запрос на слияние.
issue.action.review_dismissed=<b>@%[1]s</b> отклонил последний отзыв с %[2]s для этого запроса на слияние. issue.action.review_dismissed=<b>@%[1]s</b> отклонил(а) последний отзыв с %[2]s для этого запроса на слияние.
issue.action.ready_for_review=<b>@%[1]s</b> отметил этот запрос на слияние как готовый к рассмотрению. issue.action.ready_for_review=<b>@%[1]s</b> отметил(а) этот запрос на слияние как готовый к рассмотрению.
issue.action.new=<b>@%[1]s</b> создал #%[2]d. issue.action.new=<b>@%[1]s</b> создал(а) #%[2]d.
issue.in_tree_path=В %s: issue.in_tree_path=В %s:
release.new.subject=%s в %s выпущено release.new.subject=%s в %s выпущено
release.new.text=<b>@%[1]s</b> выпустил релиз %[2]s в %[3]s release.new.text=<b>@%[1]s</b> выпустил(а) релиз %[2]s в %[3]s
release.title=Название: %s release.title=Название: %s
release.note=Примечание: release.note=Примечание:
release.downloads=Загрузки: release.downloads=Загрузки:
@ -411,9 +419,9 @@ alpha_dash_error=` должен содержать только буквенно
alpha_dash_dot_error=` должен содержать только буквенно-цифровые символы, тире ('-'), подчеркивания ('_') и точки ('.').` alpha_dash_dot_error=` должен содержать только буквенно-цифровые символы, тире ('-'), подчеркивания ('_') и точки ('.').`
git_ref_name_error=` должно быть правильным ссылочным именем Git.` git_ref_name_error=` должно быть правильным ссылочным именем Git.`
size_error=` должен быть размер %s.` size_error=` должен быть размер %s.`
min_size_error=«должен содержать по крайней мере %s символов.» min_size_error=` должен содержать по крайней мере %s символов.`
max_size_error=` должен содержать максимум %s символов.` max_size_error=` должен содержать максимум %s символов.`
email_error=`не является адресом электронной почты.` email_error=` не является адресом электронной почты.`
url_error=` не является допустимым URL-адресом.` url_error=` не является допустимым URL-адресом.`
include_error=` должен содержать '%s'.` include_error=` должен содержать '%s'.`
glob_pattern_error=` неверный glob шаблон: %s.` glob_pattern_error=` неверный glob шаблон: %s.`
@ -445,9 +453,9 @@ password_uppercase_one=Как минимум один заглавный сим
password_digit_one=По крайней мере одна цифра password_digit_one=По крайней мере одна цифра
password_special_one=По крайней мере один специальный символ (знаки пунктуации, скобки, кавычки и т. д.) password_special_one=По крайней мере один специальный символ (знаки пунктуации, скобки, кавычки и т. д.)
enterred_invalid_repo_name=Введённое вами название репозитория неверно. enterred_invalid_repo_name=Введённое вами название репозитория неверно.
enterred_invalid_org_name=Введенное вам название организации некоррктно. enterred_invalid_org_name=Введённое вам название организации некорректно.
enterred_invalid_owner_name=Имя нового владельца недоступно. enterred_invalid_owner_name=Имя нового владельца некорректно.
enterred_invalid_password=Введенный пароль неверный. enterred_invalid_password=Введённый пароль неверен.
user_not_exist=Пользователь не существует. user_not_exist=Пользователь не существует.
team_not_exist=Команда не существует. team_not_exist=Команда не существует.
last_org_owner=Вы не можете удалить последнего пользователя из команды 'Владельцы'. Для организации должен быть хотя бы один владелец. last_org_owner=Вы не можете удалить последнего пользователя из команды 'Владельцы'. Для организации должен быть хотя бы один владелец.
@ -456,14 +464,14 @@ cannot_add_org_to_team=Организацию нельзя добавить в
invalid_ssh_key=Не удается проверить SSH ключ: %s invalid_ssh_key=Не удается проверить SSH ключ: %s
invalid_gpg_key=Не удается проверить GPG ключ: %s invalid_gpg_key=Не удается проверить GPG ключ: %s
invalid_ssh_principal=Неверный участник: %s invalid_ssh_principal=Неверный участник: %s
unable_verify_ssh_key=Не удается проверить ключ SSH; дважды проверьте его на наличие ошибок. unable_verify_ssh_key=Не удаётся проверить ключ SSH; перепроверьте его на наличие ошибок.
auth_failed=Ошибка аутентификации: %v auth_failed=Ошибка аутентификации: %v
still_own_repo=Ваша учетная запись владеет одним или несколькими репозиториями; удалите или перенесите их в первую очередь. still_own_repo=Ваша учётная запись владеет одним или несколькими репозиториями; сначала удалите или перенесите их.
still_has_org=Ваша учетная запись является членом одной или нескольких организаций; выйдите из них в первую очередь. still_has_org=Ваша учётная запись является членом одной или нескольких организаций; сначала выйдите из них.
org_still_own_repo=Эта организация по-прежнему владеет одним или несколькими репозиториями; сначала удалите или перенесите их. org_still_own_repo=Эта организация по-прежнему владеет одним или несколькими репозиториями; сначала удалите или перенесите их.
target_branch_not_exist=Целевая ветка не существует target_branch_not_exist=Целевая ветка не существует.
[user] [user]
change_avatar=Изменить свой аватар… change_avatar=Изменить свой аватар…
@ -488,11 +496,12 @@ form.name_chars_not_allowed=Имя пользователя '%s' содержи
[settings] [settings]
profile=Профиль profile=Профиль
account=Аккаунт account=Аккаунт
appearance=Внешний вид
password=Пароль password=Пароль
security=Безопасность security=Безопасность
avatar=Аватар avatar=Аватар
ssh_gpg_keys=SSH / GPG ключи ssh_gpg_keys=SSH / GPG ключи
social=Учетные записи в соцсетях social=Учётные записи в соцсетях
applications=Приложения applications=Приложения
orgs=Управление организациями orgs=Управление организациями
repos=Репозитории repos=Репозитории
@ -512,11 +521,13 @@ website=Веб-сайт
location=Местоположение location=Местоположение
update_theme=Обновить тему update_theme=Обновить тему
update_profile=Обновить профиль update_profile=Обновить профиль
update_language=Обновить язык
update_language_not_found=Язык '%s' недоступен. update_language_not_found=Язык '%s' недоступен.
update_profile_success=Ваш профиль успешно обновлен. update_language_success=Язык обновлён.
update_profile_success=Ваш профиль успешно обновлён.
change_username=Ваше имя пользователя было изменено. change_username=Ваше имя пользователя было изменено.
change_username_prompt=Примечание: изменения имени пользователя также изменяют URL-адрес учетной записи. change_username_prompt=Примечание: изменения имени пользователя также изменяют URL-адрес учётной записи.
change_username_redirect_prompt=Старое имя пользователя будет перенаправлено до тех пор, пока оно не будет введено. change_username_redirect_prompt=Старое имя пользователя будет перенаправлять на новое до тех пор, пока его не займут.
continue=Далее continue=Далее
cancel=Отмена cancel=Отмена
language=Язык language=Язык
@ -534,6 +545,7 @@ delete_current_avatar=Удалить текущий аватар
uploaded_avatar_not_a_image=Загружаемый файл не является изображением. uploaded_avatar_not_a_image=Загружаемый файл не является изображением.
uploaded_avatar_is_too_big=Загруженный файл превысил максимальный размер. uploaded_avatar_is_too_big=Загруженный файл превысил максимальный размер.
update_avatar_success=Ваш аватар был изменен. update_avatar_success=Ваш аватар был изменен.
update_user_avatar_success=Аватар пользователя обновлён.
change_password=Обновить пароль change_password=Обновить пароль
old_password=Текущий пароль old_password=Текущий пароль
@ -793,7 +805,7 @@ trust_model_helper_collaborator_committer=Соавтор+Коммитер: До
trust_model_helper_default=По умолчанию: используйте модель доверия по умолчанию для этой установки trust_model_helper_default=По умолчанию: используйте модель доверия по умолчанию для этой установки
create_repo=Создать репозиторий create_repo=Создать репозиторий
default_branch=Ветка по умолчанию default_branch=Ветка по умолчанию
default_branch_helper=Ветка по умолчанию является базовой веткой для pull request'ов и коммитов кода. default_branch_helper=Ветка по умолчанию является базовой веткой для запросов на слияние и коммитов кода.
mirror_prune=Очистить mirror_prune=Очистить
mirror_prune_desc=Удаление устаревших отслеживаемых ссылок mirror_prune_desc=Удаление устаревших отслеживаемых ссылок
mirror_interval=Интервал зеркалирования (допустимые единицы измерения 'h', 'm', 's'). Значение 0 отключает синхронизацию. mirror_interval=Интервал зеркалирования (допустимые единицы измерения 'h', 'm', 's'). Значение 0 отключает синхронизацию.
@ -844,7 +856,7 @@ desc.internal_template=Внутренний шаблон
desc.archived=Архивировано desc.archived=Архивировано
template.items=Элементы шаблона template.items=Элементы шаблона
template.git_content=Содержимое Git (Ветвь По Умолчанию) template.git_content=Содержимое Git (ветвь по умолчанию)
template.git_hooks=Git hook'и template.git_hooks=Git hook'и
template.git_hooks_tooltip=В настоящее время вы не можете изменить или удалить Git hook'и после добавления. Выберите, только если вы доверяете репозиторию шаблона. template.git_hooks_tooltip=В настоящее время вы не можете изменить или удалить Git hook'и после добавления. Выберите, только если вы доверяете репозиторию шаблона.
template.webhooks=Веб-хуки template.webhooks=Веб-хуки
@ -854,12 +866,12 @@ template.issue_labels=Метки задач
template.one_item=Необходимо выбрать хотя бы один элемент шаблона template.one_item=Необходимо выбрать хотя бы один элемент шаблона
template.invalid=Необходимо выбрать хранилище шаблонов template.invalid=Необходимо выбрать хранилище шаблонов
archive.title=Это архивный репозиторий. Вы можете его клонировать или просматривать файлы, но не вносить изменения или открывать задачи/запросы на слияние. archive.title=Это репозиторий в архиве. Вы можете его клонировать или просматривать файлы, но не вносить изменения или открывать задачи/запросы на слияние.
archive.issue.nocomment=Этот репозиторий в архиве. Вы не можете комментировать задачи. archive.issue.nocomment=Этот репозиторий в архиве. Вы не можете комментировать задачи.
archive.pull.nocomment=Это архивный репозиторий. Вы не можете комментировать запросы на слияние. archive.pull.nocomment=Это репозиторий в архиве. Вы не можете комментировать запросы на слияние.
form.reach_limit_of_creation_1=Вы уже достигли вашего лимита в %d репозитории. form.reach_limit_of_creation_1=Достигнуто ограничение на количество репозиториев: %d.
form.reach_limit_of_creation_n=Вы уже достигли ваш предел %d репозиториев. form.reach_limit_of_creation_n=Достигнуто ограничение на количество репозиториев: %d.
form.name_reserved=Название репозитория '%s' зарезервировано. form.name_reserved=Название репозитория '%s' зарезервировано.
form.name_pattern_not_allowed=Шаблон имени репозитория '%s' не допускается. form.name_pattern_not_allowed=Шаблон имени репозитория '%s' не допускается.
@ -870,8 +882,8 @@ migrate_options_mirror_helper=Этот репозиторий будет <span c
migrate_options_mirror_disabled=Администратор вашего сайта отключил новые зеркала. migrate_options_mirror_disabled=Администратор вашего сайта отключил новые зеркала.
migrate_options_lfs=Перенос LFS файлов migrate_options_lfs=Перенос LFS файлов
migrate_options_lfs_endpoint.label=LFS Endpoint migrate_options_lfs_endpoint.label=LFS Endpoint
migrate_options_lfs_endpoint.description=Миграция попытается использовать ваш Git удаленно, чтобы <a target="_blank" rel="noopener noreferrer" href="%s">определить сервер LFS</a>. Вы также можете указать пользовательскую конечную точку, если данные хранится где-то в хранилище. migrate_options_lfs_endpoint.description=Миграция попытается использовать ваш Git удаленно, чтобы <a target="_blank" rel="noopener noreferrer" href="%s">определить сервер LFS</a>. Вы также можете указать пользовательскую конечную точку, если данные хранятся в другом месте.
migrate_options_lfs_endpoint.description.local=Поддерживается также путь на локальном сервере. migrate_options_lfs_endpoint.description.local=Также поддерживается путь на локальном сервере.
migrate_options_lfs_endpoint.placeholder=Оставьте пустым для получения из клонируемого URL migrate_options_lfs_endpoint.placeholder=Оставьте пустым для получения из клонируемого URL
migrate_items=Элементы миграции migrate_items=Элементы миграции
migrate_items_wiki=Вики migrate_items_wiki=Вики
@ -884,36 +896,39 @@ migrate_items_releases=Релизы
migrate_repo=Перенос репозитория migrate_repo=Перенос репозитория
migrate.clone_address=Перенос / Клонирование по URL migrate.clone_address=Перенос / Клонирование по URL
migrate.clone_address_desc=Это может быть HTTP/HTTPS/GIT адрес или локальный путь существующего репозитория на сервере. migrate.clone_address_desc=Это может быть HTTP/HTTPS/GIT адрес или локальный путь существующего репозитория на сервере.
migrate.clone_local_path=или путь к локальному серверу migrate.clone_local_path=или локальный путь на сервере
migrate.permission_denied=У вас нет прав на импорт локальных репозиториев. migrate.permission_denied=У вас нет прав на импорт локальных репозиториев.
migrate.invalid_local_path=Недопустимый локальный путь. Возможно он не существует или не является папкой. migrate.permission_denied_blocked=Вы не можете импортировать с запрещённых хостов, пожалуйста, попросите администратора проверить настройки ALLOWED_DOMAINS/ALLOW_LOCALNETWORKS/BLOCKED_DOMAINS.
migrate.invalid_local_path=Недопустимый локальный путь. Возможно он не существует или не является директорией.
migrate.invalid_lfs_endpoint=Конечная точка LFS недействительна. migrate.invalid_lfs_endpoint=Конечная точка LFS недействительна.
migrate.failed=Миграция не удалась: %v migrate.failed=Миграция не удалась: %v
migrate.migrate_items_options=Токен доступа необходим для миграции дополнительных элементов migrate.migrate_items_options=Токен доступа необходим для миграции дополнительных элементов
migrated_from=Перенесено с <a href="%[1]s">%[2]s</a> migrated_from=Перенесено из <a href="%[1]s">%[2]s</a>
migrated_from_fake=Перенесено с %[1]s migrated_from_fake=Перенесено из %[1]s
migrate.migrate=Миграция из %s migrate.migrate=Миграция из %s
migrate.migrating=Перенос из <b>%s</b>... migrate.migrating=Перенос из <b>%s</b>...
migrate.migrating_failed=Перенос из <b>%s</b> не удался. migrate.migrating_failed=Перенос из <b>%s</b> не удался.
migrate.migrating_failed.error=Ошибка: %s migrate.migrating_failed.error=Ошибка: %s
migrate.migrating_failed_no_addr=Миграция не удалась.
migrate.github.description=Перенести данные с github.com или других экземпляров GitHub Enterprise Server. migrate.github.description=Перенести данные с github.com или других экземпляров GitHub Enterprise Server.
migrate.git.description=Перенести только репозиторий из любого Git сервиса. migrate.git.description=Перенести только репозиторий из любого Git сервиса.
migrate.gitlab.description=Перенести данные с gitlab.com или других экземпляров GitLab. migrate.gitlab.description=Перенести данные с gitlab.com или других экземпляров GitLab.
migrate.gitea.description=Перенести данные с gitea.com или других экземпляров Gitea. migrate.gitea.description=Перенести данные с gitea.com или других экземпляров Gitea.
migrate.gogs.description=Перенести данные с notabug.org или других экземпляров Gogs. migrate.gogs.description=Перенести данные с notabug.org или других экземпляров Gogs.
migrate.onedev.description=Перенести данные с code.onedev.io или других экземпляров OneDev. migrate.onedev.description=Перенести данные с code.onedev.io или других экземпляров OneDev.
migrate.gitbucket.description=Перенести данные из экземпляров GitBucket.
migrate.migrating_git=Перенос Git данных migrate.migrating_git=Перенос Git данных
migrate.migrating_topics=Миграция тем migrate.migrating_topics=Миграция тем
migrate.migrating_milestones=Миграция этапов migrate.migrating_milestones=Миграция этапов
migrate.migrating_labels=Миграция меток migrate.migrating_labels=Миграция меток
migrate.migrating_releases=Миграция релизов migrate.migrating_releases=Миграция релизов
migrate.migrating_issues=Миграция Замечаний migrate.migrating_issues=Миграция задач
migrate.migrating_pulls=Миграция Pull Request migrate.migrating_pulls=Миграция запросов на слияние
mirror_from=зеркало из mirror_from=зеркало из
forked_from=форкнуто от forked_from=форкнуто от
generated_from=создано из generated_from=создано из
fork_from_self=Вы не можете форкнуть репозиторий, так как вы уже его владелец. fork_from_self=Вы не можете форкнуть ваш собственный репозиторий.
fork_guest_user=Войдите, чтобы форкнуть репозиторий. fork_guest_user=Войдите, чтобы форкнуть репозиторий.
watch_guest_user=Войдите, чтобы следить за этим репозиторием. watch_guest_user=Войдите, чтобы следить за этим репозиторием.
star_guest_user=Войдите, чтобы добавить в избранное этот репозиторий. star_guest_user=Войдите, чтобы добавить в избранное этот репозиторий.
@ -941,10 +956,10 @@ find_tag=Найти тег
branches=Ветки branches=Ветки
tags=Теги tags=Теги
issues=Задачи issues=Задачи
pulls=Pull Request'ы pulls=Запросы на слияние
project_board=Проекты project_board=Проекты
labels=Метки labels=Метки
org_labels_desc=Метки уровня организации, которые можно использовать с <strong>всеми репозиториями</strong> в этой организации org_labels_desc=Метки уровня организации, которые можно использовать с <strong>всеми репозиториями< / strong> в этой организации
org_labels_desc_manage=управлять org_labels_desc_manage=управлять
milestones=Этапы milestones=Этапы
@ -954,6 +969,7 @@ release=Релиз
releases=Релизы releases=Релизы
tag=Тег tag=Тег
released_this=выпустил(-а) это released_this=выпустил(-а) это
file.title=%s в %s
file_raw=Исходник file_raw=Исходник
file_history=История file_history=История
file_view_source=Просмотреть исходный код file_view_source=Просмотреть исходный код
@ -961,15 +977,18 @@ file_view_rendered=Просмотр отрендеренного
file_view_raw=Посмотреть исходник file_view_raw=Посмотреть исходник
file_permalink=Постоянная ссылка file_permalink=Постоянная ссылка
file_too_large=Этот файл слишком большой, поэтому он не может быть отображён. file_too_large=Этот файл слишком большой, поэтому он не может быть отображён.
file_copy_permalink=Копировать постоянную ссылку
video_not_supported_in_browser=Ваш браузер не поддерживает HTML5 'video' тэг. video_not_supported_in_browser=Ваш браузер не поддерживает HTML5 'video' тэг.
audio_not_supported_in_browser=Ваш браузер не поддерживает HTML5 'audio' тэг. audio_not_supported_in_browser=Ваш браузер не поддерживает HTML5 'audio' тэг.
stored_lfs=Хранится Git LFS stored_lfs=Хранится Git LFS
symbolic_link=Символическая ссылка symbolic_link=Символическая ссылка
commit_graph=Граф коммитов commit_graph=Граф коммитов
commit_graph.select=Выбрать ветку commit_graph.select=Выбрать ветку
commit_graph.hide_pr_refs=Скрыть Pull Requests commit_graph.hide_pr_refs=Скрыть запросы на слияние
commit_graph.monochrome=Моно commit_graph.monochrome=Моно
commit_graph.color=Цвет
blame=Вина blame=Вина
download_file=Скачать файл
normal_view=Обычный вид normal_view=Обычный вид
line=строка line=строка
lines=строки lines=строки
@ -988,10 +1007,10 @@ editor.delete_this_file=Удалить файл
editor.must_have_write_access=Вам необходимо иметь права на запись, чтобы вносить или предлагать изменения этого файла. editor.must_have_write_access=Вам необходимо иметь права на запись, чтобы вносить или предлагать изменения этого файла.
editor.file_delete_success=Файл '%s' удалён. editor.file_delete_success=Файл '%s' удалён.
editor.name_your_file=Назовите свой файл… editor.name_your_file=Назовите свой файл…
editor.filename_help=Чтобы добавить каталог, просто наберите название и нажмите /. Чтобы удалить каталог, перейдите к началу поля и нажмите клавишу backspace. editor.filename_help=Чтобы добавить директорию, введите название и нажмите '/'. Чтобы удалить, перейдите к началу поля и нажмите клавишу backspace.
editor.or=или editor.or=или
editor.cancel_lower=Отменить editor.cancel_lower=Отменить
editor.commit_signed_changes=Подписанные изменения editor.commit_signed_changes=Зафиксировать подписанные изменения
editor.commit_changes=Сохранить правки editor.commit_changes=Сохранить правки
editor.add_tmpl=Добавить '<filename>' editor.add_tmpl=Добавить '<filename>'
editor.add=Создал(а) '%s' editor.add=Создал(а) '%s'
@ -1000,7 +1019,7 @@ editor.delete=Удалить '%s'
editor.commit_message_desc=Добавьте необязательное расширенное описание… editor.commit_message_desc=Добавьте необязательное расширенное описание…
editor.signoff_desc=Добавить Signed-off-by коммитом в конце сообщения журнала коммитов. editor.signoff_desc=Добавить Signed-off-by коммитом в конце сообщения журнала коммитов.
editor.commit_directly_to_this_branch=Сделайте коммит прямо в ветку <strong class="branch-name">%s</strong>. editor.commit_directly_to_this_branch=Сделайте коммит прямо в ветку <strong class="branch-name">%s</strong>.
editor.create_new_branch=Создайте <strong>новую ветку</strong> для этого коммита, и сделайте Pull Request. editor.create_new_branch=Создайте <strong>новую ветку</strong> для этого коммита, и сделайте запрос на слияние.
editor.create_new_branch_np=Создать <strong>новую ветку</strong> для этого коммита. editor.create_new_branch_np=Создать <strong>новую ветку</strong> для этого коммита.
editor.propose_file_change=Предложить изменение файла editor.propose_file_change=Предложить изменение файла
editor.new_branch_name_desc=Новое название ветки… editor.new_branch_name_desc=Новое название ветки…
@ -1008,23 +1027,23 @@ editor.cancel=Отмена
editor.filename_cannot_be_empty=Имя файла не может быть пустым. editor.filename_cannot_be_empty=Имя файла не может быть пустым.
editor.filename_is_invalid=Недопустимое имя файла: '%s'. editor.filename_is_invalid=Недопустимое имя файла: '%s'.
editor.branch_does_not_exist=Ветка '%s' отсутствует в этом репозитории. editor.branch_does_not_exist=Ветка '%s' отсутствует в этом репозитории.
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.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_deleting_no_longer_exists=Удаляемый файл '%s' больше не существует в этом репозитории. editor.file_deleting_no_longer_exists=Удаляемый файл '%s' больше не существует в этом репозитории.
editor.file_changed_while_editing=Содержимое файла изменилось с момента начала редактирования. <a target="_blank" rel="noopener noreferrer" href="%s">Нажмите здесь</a>, чтобы увидеть, что было изменено, или <strong>Зафиксировать изменения снова</strong>, чтобы заменить их. editor.file_changed_while_editing=Содержимое файла изменилось с момента начала редактирования. <a target="_blank" rel="noopener noreferrer" href="%s">Нажмите здесь</a>, чтобы увидеть, что было изменено, или <strong>Зафиксировать изменения снова</strong>, чтобы заменить их.
editor.file_already_exists=Файл с именем '%s' уже существует в репозитории. editor.file_already_exists=Файл с именем '%s' уже существует в репозитории.
editor.commit_empty_file_header=Закоммитить пустой файл editor.commit_empty_file_header=Закоммитить пустой файл
editor.commit_empty_file_text=Файл, который в коммите, пуст. Продолжить? editor.commit_empty_file_text=Файл, который вы собираетесь зафиксировать, пуст. Продолжить?
editor.no_changes_to_show=Нет изменений. editor.no_changes_to_show=Нет изменений.
editor.fail_to_update_file=Ошибка обновления/создания файла '%s'. editor.fail_to_update_file=Ошибка обновления/создания файла '%s'.
editor.fail_to_update_file_summary=Ошибка: editor.fail_to_update_file_summary=Ошибка:
editor.push_rejected_no_message=Сервер отклонил изменение без сообщения. Пожалуйста, проверьте githooks. editor.push_rejected_no_message=Сервер отклонил изменение без сообщения. Пожалуйста, проверьте githooks.
editor.push_rejected=Изменение отклонено сервером. Пожалуйста, проверьте гит-хуки. editor.push_rejected=Изменение отклонено сервером. Пожалуйста, проверьте гит-хуки.
editor.push_rejected_summary=Ошибка отказа полностью: editor.push_rejected_summary=Ошибка отказа полностью:
editor.add_subdir=Добавить каталог editor.add_subdir=Добавить директорию
editor.unable_to_upload_files=Не удалось загрузить файлы в '%s' из-за ошибки: %v editor.unable_to_upload_files=Не удалось загрузить файлы в '%s' из-за ошибки: %v
editor.upload_file_is_locked=Файл '%s' заблокирован %s. editor.upload_file_is_locked=Файл '%s' заблокирован %s.
editor.upload_files_to_dir=Загрузил(а) файлы в '%s' editor.upload_files_to_dir=Загрузил(а) файлы в '%s'
@ -1061,7 +1080,7 @@ projects.description_placeholder=Описание
projects.create=Создать проект projects.create=Создать проект
projects.title=Заголовок projects.title=Заголовок
projects.new=Новый проект projects.new=Новый проект
projects.new_subheader=Координация, отслеживание и обновление работы в одном месте, так что проекты остаются прозрачными и по графику. projects.new_subheader=Координируйте, отслеживайте и обновляйте работу в одном месте, так что проекты остаются прозрачными и в графике.
projects.create_success=Проект '%s' был создан. projects.create_success=Проект '%s' был создан.
projects.deletion=Удалить проект projects.deletion=Удалить проект
projects.deletion_desc=Удаление проекта приведёт к его удалению из всех связанных задач. Продолжить? projects.deletion_desc=Удаление проекта приведёт к его удалению из всех связанных задач. Продолжить?
@ -1085,6 +1104,7 @@ projects.board.set_default=Установить по умолчанию
projects.board.set_default_desc=Установить эту доску по умолчанию для неклассифицированных задач и pull-ов projects.board.set_default_desc=Установить эту доску по умолчанию для неклассифицированных задач и pull-ов
projects.board.delete=Удалить доску projects.board.delete=Удалить доску
projects.board.deletion_desc=Удаление доски проектов перемещает все связанные задачи в 'Без категории'. Продолжить? projects.board.deletion_desc=Удаление доски проектов перемещает все связанные задачи в 'Без категории'. Продолжить?
projects.board.color=Цвет
projects.open=Открыть projects.open=Открыть
projects.close=Закрыть projects.close=Закрыть
@ -1099,7 +1119,7 @@ issues.new.title_empty=Заголовок не может быть пустым
issues.new.labels=Метки issues.new.labels=Метки
issues.new.add_labels_title=Применить метки issues.new.add_labels_title=Применить метки
issues.new.no_label=Нет меток issues.new.no_label=Нет меток
issues.new.clear_labels=Отчистить метки issues.new.clear_labels=Очистить метки
issues.new.projects=Проекты issues.new.projects=Проекты
issues.new.add_project_title=Задать проект issues.new.add_project_title=Задать проект
issues.new.clear_projects=Очистить проекты issues.new.clear_projects=Очистить проекты
@ -1139,19 +1159,22 @@ issues.remove_label=удалён %s с меткой %s
issues.remove_labels=удалён %s с метками %s issues.remove_labels=удалён %s с метками %s
issues.add_remove_labels=добавлен %s и удалён %s с метками %s issues.add_remove_labels=добавлен %s и удалён %s с метками %s
issues.add_milestone_at=`добавил(а) к этапу <b>%s</b> %s` issues.add_milestone_at=`добавил(а) к этапу <b>%s</b> %s`
issues.add_project_at=`добавил в <b>%s</b> проект %s` issues.add_project_at=`добавил(а) в <b>%s</b> проект %s`
issues.change_milestone_at=`поменял целевой этап с <b>%s</b> на <b>%s</b> %s` issues.change_milestone_at=`поменял(а) целевой этап с <b>%s</b> на <b>%s</b> %s`
issues.change_project_at=`изменил проект с <b>%s</b> на <b>%s</b> %s` issues.change_project_at=`изменил(а) проект с <b>%s</b> на <b>%s</b> %s`
issues.remove_milestone_at=`удалил из этапа <b>%s</b> %s` issues.remove_milestone_at=`удалил(а) из этапа <b>%s</b> %s`
issues.remove_project_at=`удалил это из проекта <b>%s</b> %s` issues.remove_project_at=`удалил(а) это из проекта <b>%s</b> %s`
issues.deleted_milestone=`(удалено)` issues.deleted_milestone=`(удалено)`
issues.deleted_project=`(удалено)` issues.deleted_project=`(удалено)`
issues.self_assign_at=`самоназначился %s` issues.self_assign_at=`назначил(а) на себя %s`
issues.add_assignee_at=`был(а) назначен(а) <b>%s</b> %s` issues.add_assignee_at=`был(а) назначен(а) <b>%s</b> %s`
issues.remove_assignee_at=`был снят с назначения <b>%s</b> %s` issues.remove_assignee_at=`был снят с назначения <b>%s</b> %s`
issues.remove_self_assignment=`убрал их назначение %s` issues.remove_self_assignment=`убрал(а) их назначение %s`
issues.change_title_at=`изменил заголовок с <b><strike>%s</strike></b> на <b>%s</b> %s` issues.change_title_at=`изменил(а) заголовок с <b><strike>%s</strike></b> на <b>%s</b> %s`
issues.delete_branch_at=`удалена ветка <b>%s</b> %s` issues.change_ref_at=`изменил(а) ссылку с <b><strike>%s</strike></b> на <b>%s</b> %s`
issues.remove_ref_at=`убрал(а) ссылку <b>%s</b> %s`
issues.add_ref_at=`добавил(а) ссылку <b>%s</b> %s`
issues.delete_branch_at=`удалил(а) ветку <b>%s</b> %s`
issues.open_tab=%d открыто(ы) issues.open_tab=%d открыто(ы)
issues.close_tab=%d закрыто(ы) issues.close_tab=%d закрыто(ы)
issues.filter_label=Метка issues.filter_label=Метка
@ -1198,17 +1221,17 @@ 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=`прокомментировал <a href="#%s"> %s</a>` issues.commented_at=`прокомментировал(а) <a href="#%s"> %s</a>`
issues.delete_comment_confirm=Вы уверены, что хотите удалить этот комментарий? issues.delete_comment_confirm=Вы уверены, что хотите удалить этот комментарий?
issues.context.copy_link=Копировать ссылку issues.context.copy_link=Копировать ссылку
issues.context.quote_reply=Цитировать ответ issues.context.quote_reply=Цитировать ответ
issues.context.reference_issue=Ссылка в новой проблеме issues.context.reference_issue=Ссылка в новой задаче
issues.context.edit=Редактировать issues.context.edit=Редактировать
issues.context.delete=Удалить issues.context.delete=Удалить
issues.no_content=Пока нет содержимого. issues.no_content=Пока нет содержимого.
issues.close_issue=Закрыть issues.close_issue=Закрыть
issues.pull_merged_at=`Объединил коммит <a class="ui sha" href="%[1]s"><code>%[2]s</code></a> в <b>%[3]s</b> %[4]s` issues.pull_merged_at=`объединил(а) коммит <a class="ui sha" href="%[1]s"><code>%[2]s</code></a> в <b>%[3]s</b> %[4]s`
issues.manually_pull_merged_at=`%[4]s вручную объединил коммит <a class="ui sha" href="%[1]s"><code>%[2]s</code></a> в <b>%[3]s</b>` issues.manually_pull_merged_at=`%[4]s вручную объединил(а) коммит <a class="ui sha" href="%[1]s"><code>%[2]s</code></a> в <b>%[3]s</b>`
issues.close_comment_issue=Прокомментировать и закрыть issues.close_comment_issue=Прокомментировать и закрыть
issues.reopen_issue=Открыть снова issues.reopen_issue=Открыть снова
issues.reopen_comment_issue=Прокомментировать и открыть снова issues.reopen_comment_issue=Прокомментировать и открыть снова
@ -1217,9 +1240,9 @@ issues.closed_at=`закрыл(а) эту задачу <a id="%[1]s" href="#%[1]
issues.reopened_at=`переоткрыл(а) эту проблему <a id="%[1]s" href="#%[1]s">%[2]s</a>` issues.reopened_at=`переоткрыл(а) эту проблему <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.commit_ref_at=`упомянул эту задачу в коммите <a id="%[1]s" href="#%[1]s">%[2]s</a>` issues.commit_ref_at=`упомянул эту задачу в коммите <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_issue_from=`<a href="%[3]s">ссылка на эту проблему %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>` issues.ref_issue_from=`<a href="%[3]s">ссылка на эту проблему %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_pull_from=`<a href="%[3]s">ссылается на этот Pull Request %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>` issues.ref_pull_from=`<a href="%[3]s">ссылается на этот запрос на слияние %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_closing_from=`<a href="%[3]s">ссылается на Pull Request %[4]s, который закроет эту задачу</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>` issues.ref_closing_from=`<a href="%[3]s">ссылается на запрос на слияние %[4], который закроет эту задачу</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_reopening_from=`<a href="%[3]s">ссылается на Pull Request %[4]s, который вновь откроет эту задачу</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>` issues.ref_reopening_from=`<a href="%[3]s">ссылается на запрос на слияние %[4]s, который вновь откроет эту задачу</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_closed_from=`<a href="%[3]s">закрыл этот запрос %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>` issues.ref_closed_from=`<a href="%[3]s">закрыл этот запрос %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_reopened_from=`<a href="%[3]s">переоткрыл эту задачу %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>` issues.ref_reopened_from=`<a href="%[3]s">переоткрыл эту задачу %[4]s</a> <a id="%[1]s" href="#%[1]s">%[2]s</a>`
issues.ref_from=`из %[1]s` issues.ref_from=`из %[1]s`
@ -1323,7 +1346,7 @@ issues.dependency.remove=Удалить
issues.dependency.remove_info=Удалить эту зависимость issues.dependency.remove_info=Удалить эту зависимость
issues.dependency.added_dependency=`добавить новую зависимость %s` issues.dependency.added_dependency=`добавить новую зависимость %s`
issues.dependency.removed_dependency=`убрал зависимость %s` issues.dependency.removed_dependency=`убрал зависимость %s`
issues.dependency.pr_closing_blockedby=Закрытие этого Pull Request'а блокируется следующими задачами issues.dependency.pr_closing_blockedby=Закрытие этого запроса на слияние блокируется следующими задачами
issues.dependency.issue_closing_blockedby=Закрытие этой задачи блокируется следующими задачами issues.dependency.issue_closing_blockedby=Закрытие этой задачи блокируется следующими задачами
issues.dependency.issue_close_blocks=Эта задача блокирует закрытие следующих задач issues.dependency.issue_close_blocks=Эта задача блокирует закрытие следующих задач
issues.dependency.pr_close_blocks=Этот запрос на слияние блокирует закрытие следующих задач issues.dependency.pr_close_blocks=Этот запрос на слияние блокирует закрытие следующих задач
@ -1334,21 +1357,21 @@ issues.dependency.blocked_by_short=Зависит от
issues.dependency.remove_header=Удалить зависимость issues.dependency.remove_header=Удалить зависимость
issues.dependency.issue_remove_text=Это приведет к удалению зависимости от этой задачи. Продолжить? issues.dependency.issue_remove_text=Это приведет к удалению зависимости от этой задачи. Продолжить?
issues.dependency.pr_remove_text=Это приведёт к удалению зависимости от этого запроса на слияние. Продолжить? issues.dependency.pr_remove_text=Это приведёт к удалению зависимости от этого запроса на слияние. Продолжить?
issues.dependency.setting=Включение зависимостей для проблем и запросов на слияние issues.dependency.setting=Включение зависимостей для задач и запросов на слияние
issues.dependency.add_error_same_issue=Вы не можете заставить задачу зависеть от самой себя. issues.dependency.add_error_same_issue=Вы не можете заставить задачу зависеть от самой себя.
issues.dependency.add_error_dep_issue_not_exist=Зависимая задача не существует. issues.dependency.add_error_dep_issue_not_exist=Зависимая задача не существует.
issues.dependency.add_error_dep_not_exist=Зависимости не существует. issues.dependency.add_error_dep_not_exist=Зависимости не существует.
issues.dependency.add_error_dep_exists=Зависимость уже существует. issues.dependency.add_error_dep_exists=Зависимость уже существует.
issues.dependency.add_error_cannot_create_circular=Вы не можете создать зависимость с двумя задачами, блокирующими друг друга. issues.dependency.add_error_cannot_create_circular=Вы не можете создать зависимость с двумя задачами, блокирующими друг друга.
issues.dependency.add_error_dep_not_same_repo=Обе задачи должны находиться в одном репозитории. issues.dependency.add_error_dep_not_same_repo=Обе задачи должны находиться в одном репозитории.
issues.review.self.approval=Вы не можете одобрить собственный Pull Request. issues.review.self.approval=Вы не можете одобрить собственный запрос на слияние.
issues.review.self.rejection=Невозможно запрашивать изменения своего Pull Request'а. issues.review.self.rejection=Невозможно запрашивать изменения своего запроса на слияние.
issues.review.approve=одобрил(а) эти изменения %s issues.review.approve=одобрил(а) эти изменения %s
issues.review.comment=рассмотрел(а) изменения %s issues.review.comment=рассмотрел(а) изменения %s
issues.review.dismissed=отклонен отзыв %s %s issues.review.dismissed=отклонен отзыв %s %s
issues.review.dismissed_label=Отклонено issues.review.dismissed_label=Отклонено
issues.review.left_comment=оставил комментарий issues.review.left_comment=оставил комментарий
issues.review.content.empty=Запрашивая изменения, вы обязаны оставить комментарий с пояснением своих пожеланий относительно Pull Request'а. issues.review.content.empty=Запрашивая изменения, вы обязаны оставить комментарий с пояснением своих пожеланий относительно запроса на слияние.
issues.review.reject=запросил(а) изменения %s issues.review.reject=запросил(а) изменения %s
issues.review.wait=был запрошен для отзыва %s issues.review.wait=был запрошен для отзыва %s
issues.review.add_review_request=запросил отзыв от %s %s issues.review.add_review_request=запросил отзыв от %s %s
@ -1367,54 +1390,63 @@ issues.review.un_resolve_conversation=Незавершённый разгово
issues.review.resolved_by=пометить этот разговор как разрешённый issues.review.resolved_by=пометить этот разговор как разрешённый
issues.assignee.error=Не все назначения были добавлены из-за непредвиденной ошибки. issues.assignee.error=Не все назначения были добавлены из-за непредвиденной ошибки.
issues.reference_issue.body=Тело issues.reference_issue.body=Тело
issues.content_history.deleted=удалено
issues.content_history.edited=отредактировано
issues.content_history.created=создано
issues.content_history.delete_from_history=Удалить из истории
issues.content_history.delete_from_history_confirm=Удалить из истории?
issues.content_history.options=Настройки
compare.compare_base=Основа compare.compare_base=Основа
compare.compare_head=сравнить compare.compare_head=сравнить
pulls.desc=Включить запросы на слияние и проверки кода. pulls.desc=Включить запросы на слияние и проверки кода.
pulls.new=Новый Pull Request pulls.new=Новый запрос на слияние
pulls.compare_changes=Новый Pull Request pulls.compare_changes=Новый запрос на слияние
pulls.compare_changes_desc=Сравнить две ветки и создать запрос на слияние для изменений. pulls.compare_changes_desc=Сравнить две ветки и создать запрос на слияние для изменений.
pulls.compare_base=родительская ветка pulls.compare_base=родительская ветка
pulls.compare_compare=взять из pulls.compare_compare=взять из
pulls.switch_comparison_type=Переключить тип сравнения
pulls.switch_head_and_base=Поменять исходную и целевую ветки местами
pulls.filter_branch=Фильтр по ветке pulls.filter_branch=Фильтр по ветке
pulls.no_results=Результатов не найдено. pulls.no_results=Результатов не найдено.
pulls.nothing_to_compare=Нечего сравнивать, родительская и текущая ветка одинаковые. pulls.nothing_to_compare=Нечего сравнивать, родительская и текущая ветка одинаковые.
pulls.nothing_to_compare_and_allow_empty_pr=Ветки идентичны. Этот PR будет пустым. pulls.nothing_to_compare_and_allow_empty_pr=Ветки идентичны. Этот PR будет пустым.
pulls.create=Создать Pull Request pulls.has_pull_request=`Запрос на слияние этих веток уже существует: <a href="%[1]s">%[2]s#%[3]d</a>`
pulls.create=Создать запрос на слияние
pulls.title_desc=хочет смерджить %[1]d коммит(ов) из <code>%[2]s</code> в <code id="branch_target">%[3]s</code> pulls.title_desc=хочет смерджить %[1]d коммит(ов) из <code>%[2]s</code> в <code id="branch_target">%[3]s</code>
pulls.merged_title_desc=слито %[1]d коммит(ов) из <code>%[2]s</code> в <code>%[3]s</code> %[4]s pulls.merged_title_desc=слито %[1]d коммит(ов) из <code>%[2]s</code> в <code>%[3]s</code> %[4]s
pulls.change_target_branch_at=`изменил целевую ветку с <b>%s</b> на <b>%s</b> %s` pulls.change_target_branch_at=`изменил целевую ветку с <b>%s</b> на <b>%s</b> %s`
pulls.tab_conversation=Обсуждение pulls.tab_conversation=Обсуждение
pulls.tab_commits=Коммиты pulls.tab_commits=Коммиты
pulls.tab_files=Изменённые файлы pulls.tab_files=Изменённые файлы
pulls.reopen_to_merge=Пожалуйста, переоткройте этот Pull Request для выполнения слияния. pulls.reopen_to_merge=Пожалуйста, переоткройте этот запрос на слияние для выполнения слияния.
pulls.cant_reopen_deleted_branch=Этот запрос на слияние не может быть открыт заново, потому что ветка была удалена. pulls.cant_reopen_deleted_branch=Этот запрос на слияние не может быть открыт заново, потому что ветка была удалена.
pulls.merged=Слито pulls.merged=Слито
pulls.merged_as=Pull Request был объединен как <a rel="nofollow" class="ui sha" href="%[1]s"><code>%[2]s</code></a>. pulls.merged_as=Запрос на слияние был объединен как <a rel="nofollow" class="ui sha" href="%[1]s"><code>%[2]s</code></a>.
pulls.manually_merged=Слито вручную pulls.manually_merged=Слито вручную
pulls.manually_merged_as=Pull request был объединён вручную, как <a rel="nofollow" class="ui sha" href="%[1]s"><code>%[2]s</code></a>. pulls.manually_merged_as=Запрос на слияние был объединён вручную, как <a rel="nofollow" class="ui sha" href="%[1]s"><code>%[2]s</code></a>.
pulls.is_closed=Слияние этого запроса успешно завершено. pulls.is_closed=Запрос на слияние был закрыт.
pulls.has_merged=Слияние этого запроса успешно завершено. pulls.has_merged=Слияние этого запроса успешно завершено.
pulls.title_wip_desc=`<a href="#">Добавьте <strong>%s</strong> в начало заголовка</a> для защиты от случайного досрочного принятия Pull Request'а.` pulls.title_wip_desc=`<a href="#">Добавьте <strong>%s</strong> в начало заголовка</a> для защиты от случайного досрочного принятия запроса на слияние
pulls.cannot_merge_work_in_progress=Этот запрос на слияние помечен как в процессе работы. pulls.cannot_merge_work_in_progress=Этот запрос на слияние помечен как в процессе работы.
pulls.still_in_progress=Всё ещё в процессе? pulls.still_in_progress=Всё ещё в процессе?
pulls.add_prefix=Добавить <strong>%s</strong> префикс pulls.add_prefix=Добавить <strong>%s</strong> префикс
pulls.remove_prefix=Удалить <strong>%s</strong> префикс pulls.remove_prefix=Удалить <strong>%s</strong> префикс
pulls.data_broken=Содержимое этого запроса было нарушено вследствие удаления информации форка. pulls.data_broken=Содержимое этого запроса было нарушено вследствие удаления информации форка.
pulls.files_conflicted=Этот Pull Request имеет изменения, конфликтующие с целевой веткой. pulls.files_conflicted=Этот запрос на слияние имеет изменения конфликтующие с целевой веткой.
pulls.is_checking=Продолжается проверка конфликтов, пожалуйста обновите страницу несколько позже. pulls.is_checking=Продолжается проверка конфликтов, пожалуйста обновите страницу несколько позже.
pulls.is_empty=Ветвь идентична с целевой. pulls.is_empty=Ветвь идентична с целевой.
pulls.required_status_check_failed=Некоторые необходимые проверки не были пройдены. pulls.required_status_check_failed=Некоторые необходимые проверки не были пройдены.
pulls.required_status_check_missing=Отсутствуют некоторые обязательные проверки. pulls.required_status_check_missing=Отсутствуют некоторые обязательные проверки.
pulls.required_status_check_administrator=Как администратор, вы все равно можете ержить этот PR. pulls.required_status_check_administrator=Как администратор, вы все равно можете принять этот запрос на слияние.
pulls.blocked_by_approvals=Этому Pull Request'у не хватает одобрений. Получено %d из %d одобрений. pulls.blocked_by_approvals=Этому запросу на слияние не хватает одобрений. Получено %d из %d одобрений.
pulls.blocked_by_rejection=Официальным проверяющим были запрошены изменения для этого запроса на слияние. pulls.blocked_by_rejection=Официальным проверяющим были запрошены изменения для этого запроса на слияние.
pulls.blocked_by_official_review_requests=Этот Pull Request содержит официальные запросы на проверку. pulls.blocked_by_official_review_requests=Этот запрос на слияние содержит официальные запросы на проверку.
pulls.blocked_by_outdated_branch=Этот Pull Request заблокирован, потому что он устарел. pulls.blocked_by_outdated_branch=Этот запрос на слияние заблокирован, потому что он устарел.
pulls.blocked_by_changed_protected_files_1=Этот Pull Request заблокирован, потому что он изменяет защищенный файл: pulls.blocked_by_changed_protected_files_1=Этот запрос на слияние заблокирован, потому что он изменяет защищенный файл:
pulls.blocked_by_changed_protected_files_n=Этот Pull Request заблокирован, потому что он изменяет защищенные файлы: pulls.blocked_by_changed_protected_files_n=Этот запрос на слияние заблокирован, потому что он изменяет защищенные файлы:
pulls.can_auto_merge_desc=Этот Pull Request может быть объединён автоматически. pulls.can_auto_merge_desc=Этот запрос на слияние может быть объединён автоматически.
pulls.cannot_auto_merge_desc=Этот запрос на слияние не может быть объединён автоматически. pulls.cannot_auto_merge_desc=Этот запрос на слияние не может быть объединён автоматически.
pulls.cannot_auto_merge_helper=Пожалуйста, совершите слияние вручную для урегулирования конфликтов. pulls.cannot_auto_merge_helper=Пожалуйста, совершите слияние вручную для урегулирования конфликтов.
pulls.num_conflicting_files_1=%d конфликтующий файл pulls.num_conflicting_files_1=%d конфликтующий файл
@ -1427,19 +1459,19 @@ pulls.waiting_count_1=%d ожидает проверки
pulls.waiting_count_n=%d ожидающих отзывов pulls.waiting_count_n=%d ожидающих отзывов
pulls.wrong_commit_id=id фиксации должен быть идентификатором фиксации в целевой ветке pulls.wrong_commit_id=id фиксации должен быть идентификатором фиксации в целевой ветке
pulls.no_merge_desc=Pull Request не может быть принят, так как отключены все настройки слияния. pulls.no_merge_desc=Запрос на слияние не может быть принят, так как отключены все настройки слияния.
pulls.no_merge_helper=Включите опции слияния в настройках репозитория или совершите слияние Pull Request'а вручную. pulls.no_merge_helper=Включите опции слияния в настройках репозитория или совершите слияние этого запроса вручную.
pulls.no_merge_wip=Данный Pull Request не может быть принят, поскольку он помечен как находящийся в разработке. pulls.no_merge_wip=Данный запрос на слияние не может быть принят, поскольку он помечен как находящийся в разработке.
pulls.no_merge_not_ready=Этот запрос не готов к слиянию, обратите внимания на ревью и проверки. pulls.no_merge_not_ready=Этот запрос не готов к слиянию, обратите внимания на ревью и проверки.
pulls.no_merge_access=У вас нет права для слияния данного запроса. pulls.no_merge_access=У вас нет права для слияния данного запроса.
pulls.merge_pull_request=Создать коммит на слияние pulls.merge_pull_request=Создать коммит на слияние
pulls.rebase_merge_pull_request=Выпольнить Rebase, а затем fast-forward слияние pulls.rebase_merge_pull_request=Выполнить Rebase, а затем fast-forward слияние
pulls.rebase_merge_commit_pull_request=Выпольнить rebase, а затем создать коммит слияния pulls.rebase_merge_commit_pull_request=Выполнить rebase, а затем создать коммит слияния
pulls.squash_merge_pull_request=Создать объединенный (squash) коммит pulls.squash_merge_pull_request=Создать объединенный (squash) коммит
pulls.merge_manually=Слито вручную pulls.merge_manually=Слито вручную
pulls.merge_commit_id=ID коммита слияния pulls.merge_commit_id=ID коммита слияния
pulls.require_signed_wont_sign=Данная ветка ожидает подписанные коммиты, однако слияние не будет подписано pulls.require_signed_wont_sign=Данная ветка ожидает подписанные коммиты, однако слияние не будет подписано
pulls.invalid_merge_option=Этот параметр слияния нельзя использовать для этого Pull Request'а. pulls.invalid_merge_option=Этот параметр слияния нельзя использовать для этого запроса на слияние.
pulls.merge_conflict=Слияние не удалось: Произошел конфликт во время слияния. Совет: попробуйте другую стратегию pulls.merge_conflict=Слияние не удалось: Произошел конфликт во время слияния. Совет: попробуйте другую стратегию
pulls.merge_conflict_summary=Сообщение об ошибке pulls.merge_conflict_summary=Сообщение об ошибке
pulls.rebase_conflict=Слияние не удалось: Произошел конфликт во время слияния: %[1]s. Совет: попробуйте другую стратегию pulls.rebase_conflict=Слияние не удалось: Произошел конфликт во время слияния: %[1]s. Совет: попробуйте другую стратегию
@ -1552,16 +1584,16 @@ activity.period.quarterly=3 месяца
activity.period.semiyearly=6 месяцев activity.period.semiyearly=6 месяцев
activity.period.yearly=1 год activity.period.yearly=1 год
activity.overview=Обзор activity.overview=Обзор
activity.active_prs_count_1=<strong>%d</strong> Активный Pull Request activity.active_prs_count_1=<strong>%d</strong> активный запросов на слияние
activity.active_prs_count_n=<strong>%d</strong> Активных Pull Request'ов activity.active_prs_count_n=<strong>%d</strong> активных запросов на слияние
activity.merged_prs_count_1=Принятый Pull Request activity.merged_prs_count_1=Принятый запрос на слияние
activity.merged_prs_count_n=Принятых Pull Request'ов activity.merged_prs_count_n=Принятых запросов на слияние
activity.opened_prs_count_1=Новый Pull Request activity.opened_prs_count_1=Новый запрос на слияние
activity.opened_prs_count_n=Новых Pull Request'ов activity.opened_prs_count_n=Новых запросов на слияние
activity.title.user_1=%d пользователь activity.title.user_1=%d пользователь
activity.title.user_n=%d пользователей activity.title.user_n=%d пользователей
activity.title.prs_1=%d Pull Request activity.title.prs_1=%d запрос на слияние
activity.title.prs_n=%d Pull Request'ов activity.title.prs_n=%d запросов на слияние
activity.title.prs_merged_by=%s приняты %s activity.title.prs_merged_by=%s приняты %s
activity.title.prs_opened_by=%s предложены %s activity.title.prs_opened_by=%s предложены %s
activity.merged_prs_label=Принято activity.merged_prs_label=Принято
@ -1580,7 +1612,7 @@ activity.new_issues_count_n=Новых задач
activity.new_issue_label=Открытые activity.new_issue_label=Открытые
activity.title.unresolved_conv_1=%d Незавершённое обсуждение activity.title.unresolved_conv_1=%d Незавершённое обсуждение
activity.title.unresolved_conv_n=%d Незавершённых обсуждений activity.title.unresolved_conv_n=%d Незавершённых обсуждений
activity.unresolved_conv_desc=Список всех старых тикетов и Pull Request'ов с недавней активностью, но ещё не закрытых либо принятых. activity.unresolved_conv_desc=Список задач и запросов на слияние с недавней активностью, но ещё не закрытых либо принятых.
activity.unresolved_conv_label=Открытые activity.unresolved_conv_label=Открытые
activity.title.releases_1=%d релиз activity.title.releases_1=%d релиз
activity.title.releases_n=%d релизов activity.title.releases_n=%d релизов
@ -1666,7 +1698,7 @@ settings.tracker_issue_style.alphanumeric=Буквенноцифровой
settings.tracker_url_format_desc=Вы можете использовать шаблоны <code>{user}</code>, <code>{repo}</code> и <code>{index}</code> для имени пользователя, репозитория и номера задачи. settings.tracker_url_format_desc=Вы можете использовать шаблоны <code>{user}</code>, <code>{repo}</code> и <code>{index}</code> для имени пользователя, репозитория и номера задачи.
settings.enable_timetracker=Включить отслеживание времени settings.enable_timetracker=Включить отслеживание времени
settings.allow_only_contributors_to_track_time=Учитывать только участников разработки в подсчёте времени settings.allow_only_contributors_to_track_time=Учитывать только участников разработки в подсчёте времени
settings.pulls_desc=Включить публичные запросы на слияние settings.pulls_desc=Включить запросы на слияние
settings.pulls.ignore_whitespace=Игнорировать незначащие изменения (пробелы, табуляция) при проверке на конфликты слияния settings.pulls.ignore_whitespace=Игнорировать незначащие изменения (пробелы, табуляция) при проверке на конфликты слияния
settings.pulls.allow_merge_commits=Разрешить коммиты слияния settings.pulls.allow_merge_commits=Разрешить коммиты слияния
settings.pulls.allow_rebase_merge=Разрешить rebase-слияние settings.pulls.allow_rebase_merge=Разрешить rebase-слияние
@ -1674,7 +1706,7 @@ settings.pulls.allow_rebase_merge_commit=Разрешить rebase с явным
settings.pulls.allow_squash_commits=Разрешить объединять коммиты перед слиянием (squash) settings.pulls.allow_squash_commits=Разрешить объединять коммиты перед слиянием (squash)
settings.pulls.allow_manual_merge=Пометить PR как слитый вручную settings.pulls.allow_manual_merge=Пометить PR как слитый вручную
settings.pulls.enable_autodetect_manual_merge=Включить автоопределение ручного слияния (Примечание: в некоторых особых случаях могут возникнуть ошибки) settings.pulls.enable_autodetect_manual_merge=Включить автоопределение ручного слияния (Примечание: в некоторых особых случаях могут возникнуть ошибки)
settings.pulls.default_delete_branch_after_merge=Удалить ветку Pull Request после слияния по умолчанию settings.pulls.default_delete_branch_after_merge=Удалить ветку запроса после его слияния по умолчанию
settings.projects_desc=Включить проекты репозитория settings.projects_desc=Включить проекты репозитория
settings.admin_settings=Настройки администратора settings.admin_settings=Настройки администратора
settings.admin_enable_health_check=Выполнять проверки целостности этого репозитория (git fsck) settings.admin_enable_health_check=Выполнять проверки целостности этого репозитория (git fsck)
@ -1779,6 +1811,7 @@ settings.content_type=Тип содержимого
settings.secret=Секретный ключ settings.secret=Секретный ключ
settings.slack_username=Имя пользователя settings.slack_username=Имя пользователя
settings.slack_icon_url=URL иконки settings.slack_icon_url=URL иконки
settings.slack_color=Цвет
settings.discord_username=Имя пользователя settings.discord_username=Имя пользователя
settings.discord_icon_url=URL иконки settings.discord_icon_url=URL иконки
settings.event_desc=На какие события этот веб-хук должен срабатывать? settings.event_desc=На какие события этот веб-хук должен срабатывать?
@ -1810,19 +1843,19 @@ settings.event_issue_milestone_desc=Этап или этап выполнени
settings.event_issue_comment=Комментарии в задаче settings.event_issue_comment=Комментарии в задаче
settings.event_issue_comment_desc=Комментарий создан, изменён или удалён. settings.event_issue_comment_desc=Комментарий создан, изменён или удалён.
settings.event_header_pull_request=События запроса на слияние settings.event_header_pull_request=События запроса на слияние
settings.event_pull_request=Pull Request settings.event_pull_request=Запрос на слияние
settings.event_pull_request_desc=Запрос на слияние открыт, закрыт, переоткрыт или отредактирован. settings.event_pull_request_desc=Запрос на слияние открыт, закрыт, переоткрыт или отредактирован.
settings.event_pull_request_assign=Запроса на слияние назначен settings.event_pull_request_assign=Запроса на слияние назначен
settings.event_pull_request_assign_desc=Запрос на получение назначен или не назначен. settings.event_pull_request_assign_desc=Запрос на слияние назначен или не назначен.
settings.event_pull_request_label=Pull Request отмечен settings.event_pull_request_label=Запрос на слияние отмечен
settings.event_pull_request_label_desc=Метки Pull Request'а обновлены или очищены. settings.event_pull_request_label_desc=Метки запроса на слияние обновлены или очищены.
settings.event_pull_request_milestone=Этап Pull Request завершен settings.event_pull_request_milestone=Этап запроса на слияние завершен
settings.event_pull_request_milestone_desc=Этап Pull request или промежуточный шаг. settings.event_pull_request_milestone_desc=Этап запроса на слияние или промежуточный шаг.
settings.event_pull_request_comment=Комментарий Pull Request settings.event_pull_request_comment=Комментарий запроса на слияние
settings.event_pull_request_comment_desc=Pull request создан, отредактирован или удалён. settings.event_pull_request_comment_desc=Комментарий запроса на слияние создан, отредактирован или удалён.
settings.event_pull_request_review=Pull Request рассмотрен settings.event_pull_request_review=Запрос на слияние рассмотрен
settings.event_pull_request_review_desc=Запрос на слияние утвержден, отклонён или оставлен комментарий. settings.event_pull_request_review_desc=Запрос на слияние утвержден, отклонён или оставлен комментарий.
settings.event_pull_request_sync=Синхронизация Pull Request settings.event_pull_request_sync=Синхронизация запроса на слияние
settings.event_pull_request_sync_desc=Запрос на слияние синхронизирован. settings.event_pull_request_sync_desc=Запрос на слияние синхронизирован.
settings.branch_filter=Фильтр веток settings.branch_filter=Фильтр веток
settings.branch_filter_desc=Белый список ветвей для событий Push, создания ветвей и удаления ветвей, указанных в виде глоб-шаблона. Если пустой или <code>*</code>, то все событий для всех ветвей будут зарегистрированы. Перейдите по ссылке <a href="https://godoc.org/github.com/gobwas/glob#Compile">github.com/gobwas/glob</a> на документацию по синтаксису. Примеры: <code>master</code>, <code>{master,release*}</code>. settings.branch_filter_desc=Белый список ветвей для событий Push, создания ветвей и удаления ветвей, указанных в виде глоб-шаблона. Если пустой или <code>*</code>, то все событий для всех ветвей будут зарегистрированы. Перейдите по ссылке <a href="https://godoc.org/github.com/gobwas/glob#Compile">github.com/gobwas/glob</a> на документацию по синтаксису. Примеры: <code>master</code>, <code>{master,release*}</code>.
@ -1878,21 +1911,21 @@ settings.protect_whitelist_users=Пользователи, которые мог
settings.protect_whitelist_search_users=Поиск пользователей… settings.protect_whitelist_search_users=Поиск пользователей…
settings.protect_whitelist_teams=Команды, члены которых могут делать push в эту ветку: settings.protect_whitelist_teams=Команды, члены которых могут делать push в эту ветку:
settings.protect_whitelist_search_teams=Поиск команд… settings.protect_whitelist_search_teams=Поиск команд…
settings.protect_merge_whitelist_committers=Ограничить право на принятие Pull Request'ов в эту ветку списком settings.protect_merge_whitelist_committers=Ограничить право на слияние белым списком
settings.protect_merge_whitelist_committers_desc=Вы можете добавлять пользователей или целые команды в "белый" список этой ветки. Только присутствующие в списке смогут принимать Pull Request'ы. В противном случае любой с правами на запись в репозиторий будет обладать такой возможностью. settings.protect_merge_whitelist_committers_desc=Вы можете добавлять пользователей или целые команды в "белый" список этой ветки. Только присутствующие в списке смогут принимать запросы на слияние. В противном случае любой с правами на запись в репозиторий будет обладать такой возможностью.
settings.protect_merge_whitelist_users=Пользователи с правом на принятие Pull Request'ов в эту ветку: settings.protect_merge_whitelist_users=Пользователи с правом на слияние:
settings.protect_merge_whitelist_teams=Команды, члены которых обладают правом на принятие Pull Request'ов в эту ветку: settings.protect_merge_whitelist_teams=Команды, члены которых обладают правом на слияние:
settings.protect_check_status_contexts=Включить проверку статуса settings.protect_check_status_contexts=Включить проверку статуса
settings.protect_check_status_contexts_desc=Требуется пройти проверку состояния перед слиянием. Выберите, какие проверки состояния должны быть пройдены, прежде чем ветви можно будет объединить в ветвь, соответствующую этому правилу. Если этот параметр включен, коммиты сначала должны быть перемещены в другую ветвь, а затем объединены или перемещены непосредственно в ветвь, соответствующую этому правилу, после прохождения проверки состояния. Если контексты не выбраны, то последняя фиксация должна быть успешной независимо от контекста. settings.protect_check_status_contexts_desc=Требуется пройти проверку состояния перед слиянием. Выберите, какие проверки состояния должны быть пройдены, прежде чем ветви можно будет объединить в ветвь, соответствующую этому правилу. Если этот параметр включен, коммиты сначала должны быть перемещены в другую ветвь, а затем объединены или перемещены непосредственно в ветвь, соответствующую этому правилу, после прохождения проверки состояния. Если контексты не выбраны, то последняя фиксация должна быть успешной независимо от контекста.
settings.protect_check_status_contexts_list=Проверки состояния за последнюю неделю для этого репозитория settings.protect_check_status_contexts_list=Проверки состояния за последнюю неделю для этого репозитория
settings.protect_required_approvals=Необходимые одобрения: settings.protect_required_approvals=Необходимые одобрения:
settings.protect_required_approvals_desc=Разрешить объединение Pull Request'а только с достаточным количеством положительных отзывов. settings.protect_required_approvals_desc=Разрешить принятие запроса на слияние только с достаточным количеством положительных отзывов.
settings.protect_approvals_whitelist_enabled=Ограничить утверждения белым списком пользователей или команд settings.protect_approvals_whitelist_enabled=Ограничить утверждения белым списком пользователей или команд
settings.protect_approvals_whitelist_enabled_desc=Только отзывы пользователей или команд из белого списка будут засчитаны до требуемых утверждений. Белый список без одобрения отзывов от всех, у кого есть количество прав на запись, к требуемым утверждениям. settings.protect_approvals_whitelist_enabled_desc=Только отзывы пользователей или команд из белого списка будут засчитаны до требуемых утверждений. Белый список без одобрения отзывов от всех, у кого есть количество прав на запись, к требуемым утверждениям.
settings.protect_approvals_whitelist_users=Рецензенты в белом списке: settings.protect_approvals_whitelist_users=Рецензенты в белом списке:
settings.protect_approvals_whitelist_teams=Команды в белом списке для рецензирования: settings.protect_approvals_whitelist_teams=Команды в белом списке для рецензирования:
settings.dismiss_stale_approvals=Отклонить устаревшие разрешения settings.dismiss_stale_approvals=Отклонить устаревшие разрешения
settings.dismiss_stale_approvals_desc=Когда новые коммиты, изменяющие содержимое Pull Request'а, отправляются в ветку, старые разрешения будут отклонены. settings.dismiss_stale_approvals_desc=Когда новые коммиты, изменяющие содержимое запроса на слияние, отправляются в ветку, старые разрешения будут отклонены.
settings.require_signed_commits=Требовать подписанные коммиты settings.require_signed_commits=Требовать подписанные коммиты
settings.require_signed_commits_desc=Отклонить push'ы в эту ветку, если они не подписаны или не проверены. settings.require_signed_commits_desc=Отклонить push'ы в эту ветку, если они не подписаны или не проверены.
settings.protect_protected_file_patterns=Защищённые шаблоны файлов (разделённые через '\;'): settings.protect_protected_file_patterns=Защищённые шаблоны файлов (разделённые через '\;'):
@ -1909,9 +1942,9 @@ settings.block_rejected_reviews=Блокировка слияния по отк
settings.block_rejected_reviews_desc=Слияние будет не возможным, если будут запрошены официальными рецензентами изменения, даже если имеется достаточное количество одобрений. settings.block_rejected_reviews_desc=Слияние будет не возможным, если будут запрошены официальными рецензентами изменения, даже если имеется достаточное количество одобрений.
settings.block_on_official_review_requests=Блокировать слияние при запросах на официальное рассмотрение settings.block_on_official_review_requests=Блокировать слияние при запросах на официальное рассмотрение
settings.block_on_official_review_requests_desc=Слияние невозможно, если не имеется достаточное количество одобрений официальных представителей. settings.block_on_official_review_requests_desc=Слияние невозможно, если не имеется достаточное количество одобрений официальных представителей.
settings.block_outdated_branch=Блокировать слияние, если pull request устарел settings.block_outdated_branch=Блокировать слияние, если запрос на слияние устарел
settings.block_outdated_branch_desc=Слияние будет невозможно, если головная ветвь находится позади базовой ветви. settings.block_outdated_branch_desc=Слияние будет невозможно, если головная ветвь находится позади базовой ветви.
settings.default_branch_desc=Главная ветка является "базовой" для вашего репозитория, на которую по умолчанию направлены все Pull Request'ы и которая является лицом вашего репозитория. Первое, что увидит посетитель — это содержимое главной ветки. Выберите её из уже существующих: settings.default_branch_desc=Главная ветка является "базовой" для вашего репозитория, на которую по умолчанию направлены все запросы на слияние и которая является лицом вашего репозитория. Первое, что увидит посетитель — это содержимое главной ветки. Выберите её из уже существующих:
settings.default_merge_style_desc=Стиль слияния по умолчанию: settings.default_merge_style_desc=Стиль слияния по умолчанию:
settings.choose_branch=Выберите ветку… settings.choose_branch=Выберите ветку…
settings.no_protected_branch=Нет защищённых веток. settings.no_protected_branch=Нет защищённых веток.
@ -1935,7 +1968,7 @@ settings.matrix.access_token=Токен доступа
settings.matrix.message_type=Тип сообщения settings.matrix.message_type=Тип сообщения
settings.archive.button=Архивировать репозиторий settings.archive.button=Архивировать репозиторий
settings.archive.header=Архивировать этот репозиторий settings.archive.header=Архивировать этот репозиторий
settings.archive.text=Архивация репозитория переведёт его в режим read-only. Он будет скрыт из панели управления, создания задач, pull-request'ов на слияние, или создание коммитов будут запрещены. settings.archive.text=Архивация репозитория переведёт его в режим только чтение. Он будет скрыт из панели управления, создания задач, запросы на слияние, или создание коммитов будут запрещены.
settings.archive.success=Репозиторий был успешно архивирован. settings.archive.success=Репозиторий был успешно архивирован.
settings.archive.error=Ошибка при попытке архивировать репозиторий. Смотрите логи для получения подробностей. settings.archive.error=Ошибка при попытке архивировать репозиторий. Смотрите логи для получения подробностей.
settings.archive.error_ismirror=Вы не можете поместить зеркалируемый репозиторий в архив. settings.archive.error_ismirror=Вы не можете поместить зеркалируемый репозиторий в архив.
@ -1972,6 +2005,8 @@ settings.lfs_pointers.inRepo=В репозитории
settings.lfs_pointers.exists=Существуют в хранилище settings.lfs_pointers.exists=Существуют в хранилище
settings.lfs_pointers.accessible=Доступно для пользователя settings.lfs_pointers.accessible=Доступно для пользователя
settings.lfs_pointers.associateAccessible=Связать доступные %d OID settings.lfs_pointers.associateAccessible=Связать доступные %d OID
settings.rename_branch_failed_exist=Невозможно переименовать ветку, потому что целевая ветка %s уже существует.
settings.rename_branch_failed_not_exist=Невозможно переименовать ветку %s, потому что она не существует.
settings.rename_branch_success=Ветка %s была успешно переименована в %s. settings.rename_branch_success=Ветка %s была успешно переименована в %s.
settings.rename_branch_from=старое название ветки settings.rename_branch_from=старое название ветки
settings.rename_branch_to=новое название ветки settings.rename_branch_to=новое название ветки
@ -2005,6 +2040,9 @@ diff.file_image_height=Высота
diff.file_byte_size=Размер diff.file_byte_size=Размер
diff.file_suppressed=Разница между файлами не показана из-за своего большого размера diff.file_suppressed=Разница между файлами не показана из-за своего большого размера
diff.file_suppressed_line_too_long=Различия файлов скрыты, потому что одна или несколько строк слишком длинны diff.file_suppressed_line_too_long=Различия файлов скрыты, потому что одна или несколько строк слишком длинны
diff.too_many_files=Некоторые файлы не были показаны из-за слишком большого количества измененных файлов
diff.show_more=Показать больше
diff.load=Загрузить разницу
diff.generated=сгенерированный diff.generated=сгенерированный
diff.vendored=поставляемый diff.vendored=поставляемый
diff.comment.placeholder=Оставить комментарий diff.comment.placeholder=Оставить комментарий
@ -2349,6 +2387,18 @@ users.still_own_repo=На вашем аккаунте все еще остает
users.still_has_org=Эта учетная запись все еще является членом одной или более организаций. Для продолжения, покиньте или удалите организации. users.still_has_org=Эта учетная запись все еще является членом одной или более организаций. Для продолжения, покиньте или удалите организации.
users.deletion_success=Учётная запись успешно удалена. users.deletion_success=Учётная запись успешно удалена.
users.reset_2fa=Сброс 2FA users.reset_2fa=Сброс 2FA
users.list_status_filter.menu_text=Фильтр
users.list_status_filter.reset=Сбросить
users.list_status_filter.is_active=Активный
users.list_status_filter.not_active=Неактивный
users.list_status_filter.is_admin=Администратор
users.list_status_filter.not_admin=Не администратор
users.list_status_filter.is_restricted=Ограничено
users.list_status_filter.not_restricted=Не ограничено
users.list_status_filter.is_prohibit_login=Запретить вход
users.list_status_filter.not_prohibit_login=Разрешить вход
users.list_status_filter.is_2fa_enabled=2FA включено
users.list_status_filter.not_2fa_enabled=2FA отключено
emails.email_manage_panel=Управление эл. почтой пользователя emails.email_manage_panel=Управление эл. почтой пользователя
emails.primary=Первичный emails.primary=Первичный
@ -2414,6 +2464,7 @@ auths.attribute_name=Атрибут First Name
auths.attribute_surname=Атрибут Surname auths.attribute_surname=Атрибут Surname
auths.attribute_mail=Атрибут электронной почты auths.attribute_mail=Атрибут электронной почты
auths.attribute_ssh_public_key=Атрибут Открытый SSH ключ auths.attribute_ssh_public_key=Атрибут Открытый SSH ключ
auths.attribute_avatar=Характеристики аватара
auths.attributes_in_bind=Извлекать атрибуты в контексте Bind DN auths.attributes_in_bind=Извлекать атрибуты в контексте Bind DN
auths.allow_deactivate_all=Разрешить пустой результат поиска для отключения всех пользователей auths.allow_deactivate_all=Разрешить пустой результат поиска для отключения всех пользователей
auths.use_paged_search=Использовать постраничный поиск auths.use_paged_search=Использовать постраничный поиск
@ -2501,6 +2552,7 @@ config.app_ver=Версия Gitea
config.app_url=Базовый URL-адрес Gitea config.app_url=Базовый URL-адрес Gitea
config.custom_conf=Путь к файлу конфигурации config.custom_conf=Путь к файлу конфигурации
config.custom_file_root_path=Пользовательский путь до папки с файлами config.custom_file_root_path=Пользовательский путь до папки с файлами
config.domain=Домен сервера
config.offline_mode=Локальный режим config.offline_mode=Локальный режим
config.disable_router_log=Отключение журнала маршрутизатора config.disable_router_log=Отключение журнала маршрутизатора
config.run_user=Запуск от имени пользователя config.run_user=Запуск от имени пользователя
@ -2516,6 +2568,7 @@ config.reverse_auth_user=Имя пользователя для авториза
config.ssh_config=Конфигурация SSH config.ssh_config=Конфигурация SSH
config.ssh_enabled=SSH включён config.ssh_enabled=SSH включён
config.ssh_start_builtin_server=Использовать встроенный сервер config.ssh_start_builtin_server=Использовать встроенный сервер
config.ssh_domain=Домен SSH сервера
config.ssh_port=Порт config.ssh_port=Порт
config.ssh_listen_port=Прослушиваемый порт config.ssh_listen_port=Прослушиваемый порт
config.ssh_root_path=Корневой путь config.ssh_root_path=Корневой путь
@ -2712,14 +2765,34 @@ notices.delete_success=Уведомления системы были удале
[action] [action]
create_repo=создал(а) репозиторий <a href="%s"> %s</a> create_repo=создал(а) репозиторий <a href="%s"> %s</a>
rename_repo=переименовал(а) репозиторий из <code>%[1]s</code> на <a href="%[2]s">%[3]s</a> rename_repo=переименовал(а) репозиторий из <code>%[1]s</code> на <a href="%[2]s">%[3]s</a>
commit_repo=отправил(а) изменения в <a href="%[2]s">%[3]s</a> в <a href="%[1]s">%[4]s</a>
create_issue=`открыл(а) задачу <a href="%[1]s">%[3]s#%[2]s</a>`
close_issue=`закрыл(а) задачу <a href="%[1]s">%[3]s#%[2]s</a>`
reopen_issue=`переоткрыл(а) задачу <a href="%[1]s">%[3]s#%[2]s</a>`
create_pull_request=`создал(а) запрос на слияние <a href="%[1]s">%[3]s#%[2]s</a>`
close_pull_request=`закрыл(а) запрос на слияние <a href="%[1]s">%[3]s#%[2]s</a>`
reopen_pull_request=`переоткрыл(а) запрос на слияние <a href="%[1]s">%[3]s#%[2]s</a>`
comment_issue=`прокомментировал(а) задачу <a href="%[1]s">%[3]s#%[2]s</a>`
comment_pull=`прокомментировал(а) запрос на слияние <a href="%[1]s">%[3]s#%[2]s</a>`
merge_pull_request=`принял(а) запрос на слияние <a href="%[1]s">%[3]s#%[2]s</a>`
transfer_repo=передал(а) репозиторий <code>%s</code> <a href="%s">%s</a> transfer_repo=передал(а) репозиторий <code>%s</code> <a href="%s">%s</a>
push_tag=создал(а) тег <a href="%[2]s">%[3]s</a> в <a href="%[1]s">%[4]s</a>
delete_tag=удалил(а) тэг %[2]s из <a href="%[1]s">%[3]s</a> delete_tag=удалил(а) тэг %[2]s из <a href="%[1]s">%[3]s</a>
delete_branch=удалил(а) ветку %[2]s из <a href="%[1]s">%[3]s</a> delete_branch=удалил(а) ветку %[2]s из <a href="%[1]s">%[3]s</a>
compare_branch=Сравнить compare_branch=Сравнить
compare_commits=Сравнить %d коммитов compare_commits=Сравнить %d коммитов
compare_commits_general=Сравнить коммиты compare_commits_general=Сравнить коммиты
mirror_sync_push=синхронизировал(а) коммиты <a href="%[2]s">%[3]s</a> в <a href="%[1]s">%[4]s</a> из зеркала
mirror_sync_create=синхронизировал(а) новую ссылку <a href="%[2]s">%[3]s</a> в <a href="%[1]s">%[4]s</a> из зеркала
mirror_sync_delete=синхронизированные и удаленные ссылки <code>%[2]s</code> на <a href="%[1]s">%[3]s</a> из зеркала mirror_sync_delete=синхронизированные и удаленные ссылки <code>%[2]s</code> на <a href="%[1]s">%[3]s</a> из зеркала
approve_pull_request=`утвердил(а) задачу <a href="%[1]s">%[3]s#%[2]s</a>`
reject_pull_request=`предложил(а) изменения для <a href="%[1]s">%[3]s#%[2]s</a>`
publish_release=`выпустил(а) <a href="%[2]s"> "%[4]s" </a> в <a href="%[1]s">%[3]s</a>`
review_dismissed=`отклонил(а) отзыв от <b>%[4]s</b> для <a href="%[1]s">%[3]s#%[2]s</a>`
review_dismissed_reason=Причина: review_dismissed_reason=Причина:
create_branch=создал(а) ветку <a href="%[2]s">%[3]s</a> в <a href="%[1]s">%[4]s</a>
starred_repo=добавил(а) <a href="%[1]s">%[2]s</a> в избранное
watched_repo=начала(а) наблюдение за <a href="%[1]s">%[2]s</a>
[tool] [tool]
ago=%s назад ago=%s назад

View File

@ -760,7 +760,7 @@ visibility.private_tooltip=仅对组织成员可见
[repo] [repo]
new_repo_helper=仓库包含所有项目文件,包括修订历史。已经在别处有了吗? <a href="%s">迁移代码库</a> new_repo_helper=仓库包含所有项目文件,包括修订历史。已经在别处有了吗? <a href="%s">迁移代码库</a>
owner=拥有者 owner=拥有者
owner_helper=由于最大存储库数量限制,一些组织可能不会显示在下拉列表中。 owner_helper=由于最大库数量限制,一些组织可能不会显示在下拉列表中。
repo_name=仓库名称 repo_name=仓库名称
repo_name_helper=好的仓库名称应当使用简短、有意义和独特的关键字。 repo_name_helper=好的仓库名称应当使用简短、有意义和独特的关键字。
repo_size=仓库大小 repo_size=仓库大小
@ -1661,7 +1661,7 @@ settings.hooks=Web 钩子
settings.githooks=管理 Git 钩子 settings.githooks=管理 Git 钩子
settings.basic_settings=基本设置 settings.basic_settings=基本设置
settings.mirror_settings=镜像设置 settings.mirror_settings=镜像设置
settings.mirror_settings.docs=将你的项目设置成自动从其它仓库推送或拉取变更。分支、标签以及提交将会自动同步。<a target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io/en-us/repo-mirror/">如何镜像存储库?</a> settings.mirror_settings.docs=将你的项目设置成自动从其它仓库推送或拉取变更。分支、标签以及提交将会自动同步。<a target="_blank" rel="noopener noreferrer" href="https://docs.gitea.io/en-us/repo-mirror/">如何镜像库?</a>
settings.mirror_settings.mirrored_repository=镜像库 settings.mirror_settings.mirrored_repository=镜像库
settings.mirror_settings.direction=方向 settings.mirror_settings.direction=方向
settings.mirror_settings.direction.pull=拉取 settings.mirror_settings.direction.pull=拉取

View File

@ -9,6 +9,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"net/http" "net/http"
"strings"
"code.gitea.io/gitea/models" "code.gitea.io/gitea/models"
"code.gitea.io/gitea/models/db" "code.gitea.io/gitea/models/db"
@ -203,12 +204,21 @@ func EditUser(ctx *context.APIContext) {
if form.FullName != nil { if form.FullName != nil {
u.FullName = *form.FullName u.FullName = *form.FullName
} }
var emailChanged bool
if form.Email != nil { if form.Email != nil {
u.Email = *form.Email email := strings.TrimSpace(*form.Email)
if len(u.Email) == 0 { if len(email) == 0 {
ctx.Error(http.StatusUnprocessableEntity, "", fmt.Errorf("email is not allowed to be empty string")) ctx.Error(http.StatusUnprocessableEntity, "", fmt.Errorf("email is not allowed to be empty string"))
return return
} }
if err := user_model.ValidateEmail(email); err != nil {
ctx.InternalServerError(err)
return
}
emailChanged = !strings.EqualFold(u.Email, email)
u.Email = email
} }
if form.Website != nil { if form.Website != nil {
u.Website = *form.Website u.Website = *form.Website
@ -247,7 +257,7 @@ func EditUser(ctx *context.APIContext) {
u.IsRestricted = *form.Restricted u.IsRestricted = *form.Restricted
} }
if err := user_model.UpdateUser(u); err != nil { if err := user_model.UpdateUser(u, emailChanged); err != nil {
if user_model.IsErrEmailAlreadyUsed(err) || user_model.IsErrEmailInvalid(err) { if user_model.IsErrEmailAlreadyUsed(err) || user_model.IsErrEmailInvalid(err) {
ctx.Error(http.StatusUnprocessableEntity, "", err) ctx.Error(http.StatusUnprocessableEntity, "", err)
} else { } else {

View File

@ -74,7 +74,7 @@ func UpdateUserSettings(ctx *context.APIContext) {
ctx.User.KeepActivityPrivate = *form.HideActivity ctx.User.KeepActivityPrivate = *form.HideActivity
} }
if err := user_model.UpdateUser(ctx.User); err != nil { if err := user_model.UpdateUser(ctx.User, false); err != nil {
ctx.InternalServerError(err) ctx.InternalServerError(err)
return return
} }

View File

@ -298,6 +298,13 @@ func EditUserPost(ctx *context.Context) {
ctx.RenderWithErr(errMsg, tplUserNew, &form) ctx.RenderWithErr(errMsg, tplUserNew, &form)
return return
} }
if err := user_model.ValidateEmail(form.Email); err != nil {
ctx.Data["Err_Email"] = true
ctx.RenderWithErr(ctx.Tr("form.email_error"), tplUserNew, &form)
return
}
if u.Salt, err = user_model.GetUserSalt(); err != nil { if u.Salt, err = user_model.GetUserSalt(); err != nil {
ctx.ServerError("UpdateUser", err) ctx.ServerError("UpdateUser", err)
return return
@ -332,6 +339,7 @@ func EditUserPost(ctx *context.Context) {
u.LoginName = form.LoginName u.LoginName = form.LoginName
u.FullName = form.FullName u.FullName = form.FullName
emailChanged := !strings.EqualFold(u.Email, form.Email)
u.Email = form.Email u.Email = form.Email
u.Website = form.Website u.Website = form.Website
u.Location = form.Location u.Location = form.Location
@ -352,7 +360,7 @@ func EditUserPost(ctx *context.Context) {
u.ProhibitLogin = form.ProhibitLogin u.ProhibitLogin = form.ProhibitLogin
} }
if err := user_model.UpdateUser(u); err != nil { if err := user_model.UpdateUser(u, emailChanged); err != nil {
if user_model.IsErrEmailAlreadyUsed(err) { if user_model.IsErrEmailAlreadyUsed(err) {
ctx.Data["Err_Email"] = true ctx.Data["Err_Email"] = true
ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplUserEdit, &form) ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplUserEdit, &form)

View File

@ -34,6 +34,7 @@ func NewLabel(ctx *context.Context) {
form := web.GetForm(ctx).(*forms.CreateLabelForm) form := web.GetForm(ctx).(*forms.CreateLabelForm)
ctx.Data["Title"] = ctx.Tr("repo.labels") ctx.Data["Title"] = ctx.Tr("repo.labels")
ctx.Data["PageIsLabels"] = true ctx.Data["PageIsLabels"] = true
ctx.Data["PageIsOrgSettings"] = true
if ctx.HasError() { if ctx.HasError() {
ctx.Flash.Error(ctx.Data["ErrorMsg"].(string)) ctx.Flash.Error(ctx.Data["ErrorMsg"].(string))

View File

@ -39,6 +39,7 @@ const (
// Settings render the main settings page // Settings render the main settings page
func Settings(ctx *context.Context) { func Settings(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("org.settings") ctx.Data["Title"] = ctx.Tr("org.settings")
ctx.Data["PageIsOrgSettings"] = true
ctx.Data["PageIsSettingsOptions"] = true ctx.Data["PageIsSettingsOptions"] = true
ctx.Data["CurrentVisibility"] = ctx.Org.Organization.Visibility ctx.Data["CurrentVisibility"] = ctx.Org.Organization.Visibility
ctx.Data["RepoAdminChangeTeamAccess"] = ctx.Org.Organization.RepoAdminChangeTeamAccess ctx.Data["RepoAdminChangeTeamAccess"] = ctx.Org.Organization.RepoAdminChangeTeamAccess
@ -49,6 +50,7 @@ func Settings(ctx *context.Context) {
func SettingsPost(ctx *context.Context) { func SettingsPost(ctx *context.Context) {
form := web.GetForm(ctx).(*forms.UpdateOrgSettingForm) form := web.GetForm(ctx).(*forms.UpdateOrgSettingForm)
ctx.Data["Title"] = ctx.Tr("org.settings") ctx.Data["Title"] = ctx.Tr("org.settings")
ctx.Data["PageIsOrgSettings"] = true
ctx.Data["PageIsSettingsOptions"] = true ctx.Data["PageIsSettingsOptions"] = true
ctx.Data["CurrentVisibility"] = ctx.Org.Organization.Visibility ctx.Data["CurrentVisibility"] = ctx.Org.Organization.Visibility
@ -102,7 +104,7 @@ func SettingsPost(ctx *context.Context) {
visibilityChanged := form.Visibility != org.Visibility visibilityChanged := form.Visibility != org.Visibility
org.Visibility = form.Visibility org.Visibility = form.Visibility
if err := user_model.UpdateUser(org.AsUser()); err != nil { if err := user_model.UpdateUser(org.AsUser(), false); err != nil {
ctx.ServerError("UpdateUser", err) ctx.ServerError("UpdateUser", err)
return return
} }
@ -159,6 +161,7 @@ func SettingsDeleteAvatar(ctx *context.Context) {
// SettingsDelete response for deleting an organization // SettingsDelete response for deleting an organization
func SettingsDelete(ctx *context.Context) { func SettingsDelete(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("org.settings") ctx.Data["Title"] = ctx.Tr("org.settings")
ctx.Data["PageIsOrgSettings"] = true
ctx.Data["PageIsSettingsDelete"] = true ctx.Data["PageIsSettingsDelete"] = true
if ctx.Req.Method == "POST" { if ctx.Req.Method == "POST" {
@ -188,6 +191,7 @@ func SettingsDelete(ctx *context.Context) {
// Webhooks render webhook list page // Webhooks render webhook list page
func Webhooks(ctx *context.Context) { func Webhooks(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("org.settings") ctx.Data["Title"] = ctx.Tr("org.settings")
ctx.Data["PageIsOrgSettings"] = true
ctx.Data["PageIsSettingsHooks"] = true ctx.Data["PageIsSettingsHooks"] = true
ctx.Data["BaseLink"] = ctx.Org.OrgLink + "/settings/hooks" ctx.Data["BaseLink"] = ctx.Org.OrgLink + "/settings/hooks"
ctx.Data["BaseLinkNew"] = ctx.Org.OrgLink + "/settings/hooks" ctx.Data["BaseLinkNew"] = ctx.Org.OrgLink + "/settings/hooks"
@ -219,6 +223,7 @@ func DeleteWebhook(ctx *context.Context) {
// Labels render organization labels page // Labels render organization labels page
func Labels(ctx *context.Context) { func Labels(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("repo.labels") ctx.Data["Title"] = ctx.Tr("repo.labels")
ctx.Data["PageIsOrgSettings"] = true
ctx.Data["PageIsOrgSettingsLabels"] = true ctx.Data["PageIsOrgSettingsLabels"] = true
ctx.Data["RequireTribute"] = true ctx.Data["RequireTribute"] = true
ctx.Data["LabelTemplates"] = models.LabelTemplates ctx.Data["LabelTemplates"] = models.LabelTemplates

View File

@ -113,9 +113,9 @@ func getForkRepository(ctx *context.Context) *models.Repository {
ctx.Data["ForkRepo"] = forkRepo ctx.Data["ForkRepo"] = forkRepo
ownedOrgs, err := models.GetOwnedOrgsByUserID(ctx.User.ID) ownedOrgs, err := models.GetOrgsCanCreateRepoByUserID(ctx.User.ID)
if err != nil { if err != nil {
ctx.ServerError("GetOwnedOrgsByUserID", err) ctx.ServerError("GetOrgsCanCreateRepoByUserID", err)
return nil return nil
} }
var orgs []*models.Organization var orgs []*models.Organization
@ -216,13 +216,13 @@ func ForkPost(ctx *context.Context) {
} }
} }
// Check ownership of organization. // Check if user is allowed to create repo's on the organization.
if ctxUser.IsOrganization() { if ctxUser.IsOrganization() {
isOwner, err := models.OrgFromUser(ctxUser).IsOwnedBy(ctx.User.ID) isAllowedToFork, err := models.OrgFromUser(ctxUser).CanCreateOrgRepo(ctx.User.ID)
if err != nil { if err != nil {
ctx.ServerError("IsOwnedBy", err) ctx.ServerError("CanCreateOrgRepo", err)
return return
} else if !isOwner { } else if !isAllowedToFork {
ctx.Error(http.StatusForbidden) ctx.Error(http.StatusForbidden)
return return
} }

View File

@ -554,6 +554,7 @@ func RegisterRoutes(m *web.Route) {
m.Post("/matrix/new", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost) m.Post("/matrix/new", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksNewPost)
m.Post("/msteams/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost) m.Post("/msteams/new", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksNewPost)
m.Post("/feishu/new", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost) m.Post("/feishu/new", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksNewPost)
m.Post("/wechatwork/new", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksNewPost)
m.Get("/{id}", repo.WebHooksEdit) m.Get("/{id}", repo.WebHooksEdit)
m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.WebHooksEditPost) m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.WebHooksEditPost)
m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost) m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
@ -564,6 +565,7 @@ func RegisterRoutes(m *web.Route) {
m.Post("/matrix/{id}", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost) m.Post("/matrix/{id}", bindIgnErr(forms.NewMatrixHookForm{}), repo.MatrixHooksEditPost)
m.Post("/msteams/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost) m.Post("/msteams/{id}", bindIgnErr(forms.NewMSTeamsHookForm{}), repo.MSTeamsHooksEditPost)
m.Post("/feishu/{id}", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost) m.Post("/feishu/{id}", bindIgnErr(forms.NewFeishuHookForm{}), repo.FeishuHooksEditPost)
m.Post("/wechatwork/{id}", bindIgnErr(forms.NewWechatWorkHookForm{}), repo.WechatworkHooksEditPost)
}, webhooksEnabled) }, webhooksEnabled)
m.Group("/labels", func() { m.Group("/labels", func() {

View File

@ -37,7 +37,13 @@
{{$repo := (index $.RepoMaps .RepoID)}} {{$repo := (index $.RepoMaps .RepoID)}}
<div class="diff-file-box diff-box file-content non-diff-file-content repo-search-result"> <div class="diff-file-box diff-box file-content non-diff-file-content repo-search-result">
<h4 class="ui top attached normal header"> <h4 class="ui top attached normal header">
<span class="file"><a rel="nofollow" href="{{$repo.HTMLURL}}">{{$repo.FullName}}</a> - {{.Filename}}</span> <span class="file">
<a rel="nofollow" href="{{$repo.HTMLURL}}">{{$repo.FullName}}</a>
{{if $repo.IsArchived}}
<span class="ui basic label">{{$.i18n.Tr "repo.desc.archived"}}</span>
{{end}}
- {{.Filename}}
</span>
<a class="ui basic tiny button" rel="nofollow" href="{{$repo.HTMLURL}}/src/commit/{{$result.CommitID | PathEscape}}/{{.Filename | PathEscapeSegments}}">{{$.i18n.Tr "repo.diff.view_file"}}</a> <a class="ui basic tiny button" rel="nofollow" href="{{$repo.HTMLURL}}/src/commit/{{$result.CommitID | PathEscape}}/{{.Filename | PathEscapeSegments}}">{{$.i18n.Tr "repo.diff.view_file"}}</a>
</h4> </h4>
<div class="ui attached table segment"> <div class="ui attached table segment">

View File

@ -20,7 +20,7 @@
{{if .IsOrganizationOwner}} {{if .IsOrganizationOwner}}
<div class="right menu"> <div class="right menu">
<a class="{{if .PageIsSettingsOptions}}active{{end}} item" href="{{.OrgLink}}/settings"> <a class="{{if .PageIsOrgSettings}}active{{end}} item" href="{{.OrgLink}}/settings">
{{svg "octicon-tools"}} {{.i18n.Tr "repo.settings"}} {{svg "octicon-tools"}} {{.i18n.Tr "repo.settings"}}
</a> </a>
</div> </div>

View File

@ -1,5 +1,5 @@
<div class="four wide column"> <div class="four wide column">
<div class="ui vertical menu"> <div class="ui fluid vertical menu">
<div class="header item">{{.i18n.Tr "org.settings"}}</div> <div class="header item">{{.i18n.Tr "org.settings"}}</div>
<a class="{{if .PageIsSettingsOptions}}active{{end}} item" href="{{.OrgLink}}/settings"> <a class="{{if .PageIsSettingsOptions}}active{{end}} item" href="{{.OrgLink}}/settings">
{{.i18n.Tr "org.settings.options"}} {{.i18n.Tr "org.settings.options"}}

View File

@ -1,115 +1,117 @@
{{template "base/head" .}} {{template "base/head" .}}
<div class="page-content organization new team"> <div class="page-content organization new team">
{{template "org/header" .}} {{template "org/header" .}}
<div class="ui middle very relaxed page grid"> <div class="ui container">
<div class="column"> <div class="ui grid">
<form class="ui form" action="{{if .PageIsOrgTeamsNew}}{{.OrgLink}}/teams/new{{else}}{{.OrgLink}}/teams/{{.Team.LowerName | PathEscape}}/edit{{end}}" data-delete-url="{{.OrgLink}}/teams/{{.Team.LowerName | PathEscape}}/delete" method="post"> <div class="column">
{{.CsrfTokenHtml}} <form class="ui form" action="{{if .PageIsOrgTeamsNew}}{{.OrgLink}}/teams/new{{else}}{{.OrgLink}}/teams/{{.Team.LowerName | PathEscape}}/edit{{end}}" data-delete-url="{{.OrgLink}}/teams/{{.Team.LowerName | PathEscape}}/delete" method="post">
<h3 class="ui top attached header"> {{.CsrfTokenHtml}}
{{if .PageIsOrgTeamsNew}}{{.i18n.Tr "org.create_new_team"}}{{else}}{{.i18n.Tr "org.teams.settings"}}{{end}} <h3 class="ui top attached header">
</h3> {{if .PageIsOrgTeamsNew}}{{.i18n.Tr "org.create_new_team"}}{{else}}{{.i18n.Tr "org.teams.settings"}}{{end}}
<div class="ui attached segment"> </h3>
{{template "base/alert" .}} <div class="ui attached segment">
<div class="required field {{if .Err_TeamName}}error{{end}}"> {{template "base/alert" .}}
<label for="team_name">{{.i18n.Tr "org.team_name"}}</label> <div class="required field {{if .Err_TeamName}}error{{end}}">
{{if eq .Team.LowerName "owners"}} <label for="team_name">{{.i18n.Tr "org.team_name"}}</label>
<input type="hidden" name="team_name" value="{{.Team.Name}}"> {{if eq .Team.LowerName "owners"}}
<input type="hidden" name="team_name" value="{{.Team.Name}}">
{{end}}
<input id="team_name" name="team_name" value="{{.Team.Name}}" required {{if eq .Team.LowerName "owners"}}disabled{{end}} autofocus>
<span class="help">{{.i18n.Tr "org.team_name_helper"}}</span>
</div>
<div class="field {{if .Err_Description}}error{{end}}">
<label for="description">{{.i18n.Tr "org.team_desc"}}</label>
<input id="description" name="description" value="{{.Team.Description}}">
<span class="help">{{.i18n.Tr "org.team_desc_helper"}}</span>
</div>
{{if not (eq .Team.LowerName "owners")}}
<div class="grouped field">
<label>{{.i18n.Tr "org.team_access_desc"}}</label>
<br>
<div class="field">
<div class="ui radio checkbox">
<input type="radio" name="repo_access" value="specific" {{if not .Team.IncludesAllRepositories}}checked{{end}}>
<label>{{.i18n.Tr "org.teams.specific_repositories"}}</label>
<span class="help">{{.i18n.Tr "org.teams.specific_repositories_helper" | Str2html}}</span>
</div>
</div>
<div class="field">
<div class="ui radio checkbox">
<input type="radio" name="repo_access" value="all" {{if .Team.IncludesAllRepositories}}checked{{end}}>
<label>{{.i18n.Tr "org.teams.all_repositories"}}</label>
<span class="help">{{.i18n.Tr "org.teams.all_repositories_helper" | Str2html}}</span>
</div>
</div>
<div class="field">
<div class="ui checkbox">
<label for="can_create_org_repo">{{.i18n.Tr "org.teams.can_create_org_repo"}}</label>
<input id="can_create_org_repo" name="can_create_org_repo" type="checkbox" {{if .Team.CanCreateOrgRepo}}checked{{end}}>
<span class="help">{{.i18n.Tr "org.teams.can_create_org_repo_helper"}}</span>
</div>
</div>
</div>
<div class="grouped field">
<label>{{.i18n.Tr "org.team_permission_desc"}}</label>
<br>
<div class="field">
<div class="ui radio checkbox">
<input type="radio" name="permission" value="read" {{if or .PageIsOrgTeamsNew (eq .Team.Authorize 1)}}checked{{end}}>
<label>{{.i18n.Tr "org.teams.read_access"}}</label>
<span class="help">{{.i18n.Tr "org.teams.read_access_helper"}}</span>
</div>
</div>
<div class="field">
<div class="ui radio checkbox">
<input type="radio" name="permission" value="write" {{if eq .Team.Authorize 2}}checked{{end}}>
<label>{{.i18n.Tr "org.teams.write_access"}}</label>
<span class="help">{{.i18n.Tr "org.teams.write_access_helper"}}</span>
</div>
</div>
<div class="field">
<div class="ui radio checkbox">
<input type="radio" name="permission" value="admin" {{if eq .Team.Authorize 3}}checked{{end}}>
<label>{{.i18n.Tr "org.teams.admin_access"}}</label>
<span class="help">{{.i18n.Tr "org.teams.admin_access_helper"}}</span>
</div>
</div>
</div>
<div class="ui divider"></div>
<div class="team-units required grouped field"{{if eq .Team.Authorize 3}} style="display: none"{{end}}>
<label>{{.i18n.Tr "org.team_unit_desc"}}</label>
<br>
{{range $t, $unit := $.Units}}
{{if $unit.Type.UnitGlobalDisabled}}
<div class="field tooltip" data-content="{{$.i18n.Tr "repo.unit_disabled"}}">
{{else}}
<div class="field">
{{end}}
<div class="ui toggle checkbox">
<input type="checkbox" class="hidden" name="units" value="{{$unit.Type.Value}}"{{if or (eq $.Team.ID 0) ($.Team.UnitEnabled $unit.Type)}} checked{{end}}>
<label>{{$.i18n.Tr $unit.NameKey}}{{if $unit.Type.UnitGlobalDisabled}} {{$.i18n.Tr "org.team_unit_disabled"}}{{end}}</label>
<span class="help">{{$.i18n.Tr $unit.DescKey}}</span>
</div>
</div>
{{end}}
</div>
<div class="ui divider"></div>
{{end}} {{end}}
<input id="team_name" name="team_name" value="{{.Team.Name}}" required {{if eq .Team.LowerName "owners"}}disabled{{end}} autofocus>
<span class="help">{{.i18n.Tr "org.team_name_helper"}}</span>
</div>
<div class="field {{if .Err_Description}}error{{end}}">
<label for="description">{{.i18n.Tr "org.team_desc"}}</label>
<input id="description" name="description" value="{{.Team.Description}}">
<span class="help">{{.i18n.Tr "org.team_desc_helper"}}</span>
</div>
{{if not (eq .Team.LowerName "owners")}}
<div class="grouped field">
<label>{{.i18n.Tr "org.team_access_desc"}}</label>
<br>
<div class="field">
<div class="ui radio checkbox">
<input type="radio" name="repo_access" value="specific" {{if not .Team.IncludesAllRepositories}}checked{{end}}>
<label>{{.i18n.Tr "org.teams.specific_repositories"}}</label>
<span class="help">{{.i18n.Tr "org.teams.specific_repositories_helper" | Str2html}}</span>
</div>
</div>
<div class="field">
<div class="ui radio checkbox">
<input type="radio" name="repo_access" value="all" {{if .Team.IncludesAllRepositories}}checked{{end}}>
<label>{{.i18n.Tr "org.teams.all_repositories"}}</label>
<span class="help">{{.i18n.Tr "org.teams.all_repositories_helper" | Str2html}}</span>
</div>
</div>
<div class="field"> <div class="field">
<div class="ui checkbox"> {{if .PageIsOrgTeamsNew}}
<label for="can_create_org_repo">{{.i18n.Tr "org.teams.can_create_org_repo"}}</label> <button class="ui green button">{{.i18n.Tr "org.create_team"}}</button>
<input id="can_create_org_repo" name="can_create_org_repo" type="checkbox" {{if .Team.CanCreateOrgRepo}}checked{{end}}> <a class="ui button" href="{{.OrgLink}}/teams">{{.i18n.Tr "cancel"}}</a>
<span class="help">{{.i18n.Tr "org.teams.can_create_org_repo_helper"}}</span>
</div>
</div>
</div>
<div class="grouped field">
<label>{{.i18n.Tr "org.team_permission_desc"}}</label>
<br>
<div class="field">
<div class="ui radio checkbox">
<input type="radio" name="permission" value="read" {{if or .PageIsOrgTeamsNew (eq .Team.Authorize 1)}}checked{{end}}>
<label>{{.i18n.Tr "org.teams.read_access"}}</label>
<span class="help">{{.i18n.Tr "org.teams.read_access_helper"}}</span>
</div>
</div>
<div class="field">
<div class="ui radio checkbox">
<input type="radio" name="permission" value="write" {{if eq .Team.Authorize 2}}checked{{end}}>
<label>{{.i18n.Tr "org.teams.write_access"}}</label>
<span class="help">{{.i18n.Tr "org.teams.write_access_helper"}}</span>
</div>
</div>
<div class="field">
<div class="ui radio checkbox">
<input type="radio" name="permission" value="admin" {{if eq .Team.Authorize 3}}checked{{end}}>
<label>{{.i18n.Tr "org.teams.admin_access"}}</label>
<span class="help">{{.i18n.Tr "org.teams.admin_access_helper"}}</span>
</div>
</div>
</div>
<div class="ui divider"></div>
<div class="team-units required grouped field"{{if eq .Team.Authorize 3}} style="display: none"{{end}}>
<label>{{.i18n.Tr "org.team_unit_desc"}}</label>
<br>
{{range $t, $unit := $.Units}}
{{if $unit.Type.UnitGlobalDisabled}}
<div class="field tooltip" data-content="{{$.i18n.Tr "repo.unit_disabled"}}">
{{else}} {{else}}
<div class="field"> <button class="ui green button">{{.i18n.Tr "org.teams.update_settings"}}</button>
{{end}} {{if not (eq .Team.LowerName "owners")}}
<div class="ui toggle checkbox"> <button class="ui red button delete-button" data-url="{{.OrgLink}}/teams/{{.team_name | PathEscape}}/delete">{{.i18n.Tr "org.teams.delete_team"}}</button>
<input type="checkbox" class="hidden" name="units" value="{{$unit.Type.Value}}"{{if or (eq $.Team.ID 0) ($.Team.UnitEnabled $unit.Type)}} checked{{end}}> {{end}}
<label>{{$.i18n.Tr $unit.NameKey}}{{if $unit.Type.UnitGlobalDisabled}} {{$.i18n.Tr "org.team_unit_disabled"}}{{end}}</label>
<span class="help">{{$.i18n.Tr $unit.DescKey}}</span>
</div>
</div>
{{end}} {{end}}
</div> </div>
<div class="ui divider"></div>
{{end}}
<div class="field">
{{if .PageIsOrgTeamsNew}}
<button class="ui green button">{{.i18n.Tr "org.create_team"}}</button>
<a class="ui button" href="{{.OrgLink}}/teams">{{.i18n.Tr "cancel"}}</a>
{{else}}
<button class="ui green button">{{.i18n.Tr "org.teams.update_settings"}}</button>
{{if not (eq .Team.LowerName "owners")}}
<button class="ui red button delete-button" data-url="{{.OrgLink}}/teams/{{.team_name | PathEscape}}/delete">{{.i18n.Tr "org.teams.delete_team"}}</button>
{{end}}
{{end}}
</div> </div>
</div> </form>
</form> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -26,13 +26,8 @@ export function isObject(obj) {
// returns whether a dark theme is enabled // returns whether a dark theme is enabled
export function isDarkTheme() { export function isDarkTheme() {
if (document.documentElement.classList.contains('theme-auto')) { const style = window.getComputedStyle(document.documentElement);
return window.matchMedia('(prefers-color-scheme: dark)').matches; return style.getPropertyValue('--is-dark-theme').trim().toLowerCase() === 'true';
}
if (document.documentElement.classList.contains('theme-arc-green')) {
return true;
}
return false;
} }
// removes duplicate elements in an array // removes duplicate elements in an array

View File

@ -2575,8 +2575,6 @@
.settings { .settings {
.content { .content {
margin-top: 2px;
> .header, > .header,
.segment { .segment {
box-shadow: 0 1px 2px 0 var(--color-box-header); box-shadow: 0 1px 2px 0 var(--color-box-header);

View File

@ -1,6 +1,7 @@
@import "../chroma/dark.less"; @import "../chroma/dark.less";
:root { :root {
--is-dark-theme: true;
--color-primary: #87ab63; --color-primary: #87ab63;
--color-primary-dark-1: #93b373; --color-primary-dark-1: #93b373;
--color-primary-dark-2: #9fbc82; --color-primary-dark-2: #9fbc82;