Commit a091e24d authored by Rémy Coutable's avatar Rémy Coutable

Merge remote-tracking branch 'origin/master' into ce-to-ee-2017-11-30

Signed-off-by: default avatarRémy Coutable <remy@rymai.me>
parents 4b87f081 7afa3f47
Please view this file on the master branch, on stable branches it's out of date. Please view this file on the master branch, on stable branches it's out of date.
## 10.2.3 (2017-11-30)
### Fixed (5 changes)
- Fix viewing default push rules on a Geo secondary. !3559
- Disable autocomplete for epics.
- Fix epic fullscreen editing.
- Fix tasklist for epics.
- Fix Geo wiki sync error not increasing retry count.
## 10.2.2 (2017-11-23) ## 10.2.2 (2017-11-23)
### Fixed (6 changes) ### Fixed (6 changes)
......
...@@ -2,6 +2,25 @@ ...@@ -2,6 +2,25 @@
documentation](doc/development/changelog.md) for instructions on adding your own documentation](doc/development/changelog.md) for instructions on adding your own
entry. entry.
## 10.2.3 (2017-11-30)
### Fixed (7 changes)
- Fix hashed storage for Import/Export uploads. !15482
- Ensure that rake gitlab:cleanup:repos task does not mess with hashed repositories. !15520
- Ensure that rake gitlab:cleanup:dirs task does not mess with hashed repositories. !15600
- Fix WIP system note not being created.
- Fix link text from group context.
- Fix defaults for MR states and merge statuses.
- Fix pulling and pushing using a personal access token with the sudo scope.
### Performance (3 changes)
- Drastically improve project search performance by no longer searching namespace name.
- Reuse authors when rendering event Atom feeds.
- Optimise StuckCiJobsWorker using cheap SQL query outside, and expensive inside.
## 10.2.2 (2017-11-23) ## 10.2.2 (2017-11-23)
### Fixed (5 changes) ### Fixed (5 changes)
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
noteType: constants.COMMENT, noteType: constants.COMMENT,
// Can't use mapGetters, // Can't use mapGetters,
// this needs to be in the data object because it belongs to the state // this needs to be in the data object because it belongs to the state
issueState: this.$store.getters.getIssueData.state, issueState: this.$store.getters.getNoteableData.state,
isSubmitting: false, isSubmitting: false,
isSubmitButtonDisabled: true, isSubmitButtonDisabled: true,
}; };
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
...mapGetters([ ...mapGetters([
'getCurrentUserLastNote', 'getCurrentUserLastNote',
'getUserData', 'getUserData',
'getIssueData', 'getNoteableData',
'getNotesData', 'getNotesData',
]), ]),
isLoggedIn() { isLoggedIn() {
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
return this.issueState === constants.OPENED || this.issueState === constants.REOPENED; return this.issueState === constants.OPENED || this.issueState === constants.REOPENED;
}, },
canCreateNote() { canCreateNote() {
return this.getIssueData.current_user.can_create_note; return this.getNoteableData.current_user.can_create_note;
}, },
issueActionButtonTitle() { issueActionButtonTitle() {
if (this.note.length) { if (this.note.length) {
...@@ -85,16 +85,16 @@ ...@@ -85,16 +85,16 @@
return this.getNotesData.quickActionsDocsPath; return this.getNotesData.quickActionsDocsPath;
}, },
markdownPreviewPath() { markdownPreviewPath() {
return this.getIssueData.preview_note_path; return this.getNoteableData.preview_note_path;
}, },
author() { author() {
return this.getUserData; return this.getUserData;
}, },
canUpdateIssue() { canUpdateIssue() {
return this.getIssueData.current_user.can_update; return this.getNoteableData.current_user.can_update;
}, },
endpoint() { endpoint() {
return this.getIssueData.create_note_path; return this.getNoteableData.create_note_path;
}, },
}, },
methods: { methods: {
...@@ -119,7 +119,7 @@ ...@@ -119,7 +119,7 @@
data: { data: {
note: { note: {
noteable_type: constants.NOTEABLE_TYPE, noteable_type: constants.NOTEABLE_TYPE,
noteable_id: this.getIssueData.id, noteable_id: this.getNoteableData.id,
note: this.note, note: this.note,
}, },
}, },
...@@ -207,7 +207,7 @@ ...@@ -207,7 +207,7 @@
}, },
initAutoSave() { initAutoSave() {
if (this.isLoggedIn) { if (this.isLoggedIn) {
this.autosave = new Autosave($(this.$refs.textarea), ['Note', 'Issue', this.getIssueData.id], 'issue'); this.autosave = new Autosave($(this.$refs.textarea), ['Note', 'Issue', this.getNoteableData.id], 'issue');
} }
}, },
initTaskList() { initTaskList() {
...@@ -266,9 +266,9 @@ ...@@ -266,9 +266,9 @@
<div class="error-alert"></div> <div class="error-alert"></div>
<issue-warning <issue-warning
v-if="hasWarning(getIssueData)" v-if="hasWarning(getNoteableData)"
:is-locked="isLocked(getIssueData)" :is-locked="isLocked(getNoteableData)"
:is-confidential="isConfidential(getIssueData)" :is-confidential="isConfidential(getNoteableData)"
/> />
<markdown-field <markdown-field
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
], ],
computed: { computed: {
...mapGetters([ ...mapGetters([
'getIssueData', 'getNoteableData',
]), ]),
discussion() { discussion() {
return this.note.notes[0]; return this.note.notes[0];
...@@ -50,10 +50,10 @@ ...@@ -50,10 +50,10 @@
return this.discussion.author; return this.discussion.author;
}, },
canReply() { canReply() {
return this.getIssueData.current_user.can_create_note; return this.getNoteableData.current_user.can_create_note;
}, },
newNotePath() { newNotePath() {
return this.getIssueData.create_note_path; return this.getNoteableData.create_note_path;
}, },
lastUpdatedBy() { lastUpdatedBy() {
const { notes } = this.note; const { notes } = this.note;
......
...@@ -46,8 +46,8 @@ ...@@ -46,8 +46,8 @@
computed: { computed: {
...mapGetters([ ...mapGetters([
'getDiscussionLastNote', 'getDiscussionLastNote',
'getIssueData', 'getNoteableData',
'getIssueDataByProp', 'getNoteableDataByProp',
'getNotesDataByProp', 'getNotesDataByProp',
'getUserDataByProp', 'getUserDataByProp',
]), ]),
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
return `#note_${this.noteId}`; return `#note_${this.noteId}`;
}, },
markdownPreviewPath() { markdownPreviewPath() {
return this.getIssueDataByProp('preview_note_path'); return this.getNoteableDataByProp('preview_note_path');
}, },
markdownDocsPath() { markdownDocsPath() {
return this.getNotesDataByProp('markdownDocsPath'); return this.getNotesDataByProp('markdownDocsPath');
...@@ -129,9 +129,9 @@ ...@@ -129,9 +129,9 @@
class="edit-note common-note-form js-quick-submit gfm-form"> class="edit-note common-note-form js-quick-submit gfm-form">
<issue-warning <issue-warning
v-if="hasWarning(getIssueData)" v-if="hasWarning(getNoteableData)"
:is-locked="isLocked(getIssueData)" :is-locked="isLocked(getNoteableData)"
:is-confidential="isConfidential(getIssueData)" :is-confidential="isConfidential(getNoteableData)"
/> />
<markdown-field <markdown-field
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
export default { export default {
name: 'issueNotesApp', name: 'issueNotesApp',
props: { props: {
issueData: { noteableData: {
type: Object, type: Object,
required: true, required: true,
}, },
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
actionToggleAward: 'toggleAward', actionToggleAward: 'toggleAward',
scrollToNoteIfNeeded: 'scrollToNoteIfNeeded', scrollToNoteIfNeeded: 'scrollToNoteIfNeeded',
setNotesData: 'setNotesData', setNotesData: 'setNotesData',
setIssueData: 'setIssueData', setNoteableData: 'setNoteableData',
setUserData: 'setUserData', setUserData: 'setUserData',
setLastFetchedAt: 'setLastFetchedAt', setLastFetchedAt: 'setLastFetchedAt',
setTargetNoteHash: 'setTargetNoteHash', setTargetNoteHash: 'setTargetNoteHash',
...@@ -106,7 +106,7 @@ ...@@ -106,7 +106,7 @@
}, },
created() { created() {
this.setNotesData(this.notesData); this.setNotesData(this.notesData);
this.setIssueData(this.issueData); this.setNoteableData(this.noteableData);
this.setUserData(this.userData); this.setUserData(this.userData);
}, },
mounted() { mounted() {
......
...@@ -10,7 +10,7 @@ document.addEventListener('DOMContentLoaded', () => new Vue({ ...@@ -10,7 +10,7 @@ document.addEventListener('DOMContentLoaded', () => new Vue({
const notesDataset = document.getElementById('js-vue-notes').dataset; const notesDataset = document.getElementById('js-vue-notes').dataset;
return { return {
issueData: JSON.parse(notesDataset.issueData), noteableData: JSON.parse(notesDataset.noteableData),
currentUserData: JSON.parse(notesDataset.currentUserData), currentUserData: JSON.parse(notesDataset.currentUserData),
notesData: { notesData: {
lastFetchedAt: notesDataset.lastFetchedAt, lastFetchedAt: notesDataset.lastFetchedAt,
...@@ -26,7 +26,7 @@ document.addEventListener('DOMContentLoaded', () => new Vue({ ...@@ -26,7 +26,7 @@ document.addEventListener('DOMContentLoaded', () => new Vue({
render(createElement) { render(createElement) {
return createElement('issue-notes-app', { return createElement('issue-notes-app', {
props: { props: {
issueData: this.issueData, noteableData: this.noteableData,
notesData: this.notesData, notesData: this.notesData,
userData: this.currentUserData, userData: this.currentUserData,
}, },
......
...@@ -12,7 +12,7 @@ import { isInViewport, scrollToElement } from '../../lib/utils/common_utils'; ...@@ -12,7 +12,7 @@ import { isInViewport, scrollToElement } from '../../lib/utils/common_utils';
let eTagPoll; let eTagPoll;
export const setNotesData = ({ commit }, data) => commit(types.SET_NOTES_DATA, data); export const setNotesData = ({ commit }, data) => commit(types.SET_NOTES_DATA, data);
export const setIssueData = ({ commit }, data) => commit(types.SET_ISSUE_DATA, data); export const setNoteableData = ({ commit }, data) => commit(types.SET_NOTEABLE_DATA, data);
export const setUserData = ({ commit }, data) => commit(types.SET_USER_DATA, data); export const setUserData = ({ commit }, data) => commit(types.SET_USER_DATA, data);
export const setLastFetchedAt = ({ commit }, data) => commit(types.SET_LAST_FETCHED_AT, data); export const setLastFetchedAt = ({ commit }, data) => commit(types.SET_LAST_FETCHED_AT, data);
export const setInitialNotes = ({ commit }, data) => commit(types.SET_INITIAL_NOTES, data); export const setInitialNotes = ({ commit }, data) => commit(types.SET_INITIAL_NOTES, data);
......
...@@ -6,8 +6,8 @@ export const targetNoteHash = state => state.targetNoteHash; ...@@ -6,8 +6,8 @@ export const targetNoteHash = state => state.targetNoteHash;
export const getNotesData = state => state.notesData; export const getNotesData = state => state.notesData;
export const getNotesDataByProp = state => prop => state.notesData[prop]; export const getNotesDataByProp = state => prop => state.notesData[prop];
export const getIssueData = state => state.issueData; export const getNoteableData = state => state.noteableData;
export const getIssueDataByProp = state => prop => state.issueData[prop]; export const getNoteableDataByProp = state => prop => state.noteableData[prop];
export const getUserData = state => state.userData || {}; export const getUserData = state => state.userData || {};
export const getUserDataByProp = state => prop => state.userData && state.userData[prop]; export const getUserDataByProp = state => prop => state.userData && state.userData[prop];
......
...@@ -15,7 +15,7 @@ export default new Vuex.Store({ ...@@ -15,7 +15,7 @@ export default new Vuex.Store({
// holds endpoints and permissions provided through haml // holds endpoints and permissions provided through haml
notesData: {}, notesData: {},
userData: {}, userData: {},
issueData: {}, noteableData: {},
}, },
actions, actions,
getters, getters,
......
...@@ -3,7 +3,7 @@ export const ADD_NEW_REPLY_TO_DISCUSSION = 'ADD_NEW_REPLY_TO_DISCUSSION'; ...@@ -3,7 +3,7 @@ export const ADD_NEW_REPLY_TO_DISCUSSION = 'ADD_NEW_REPLY_TO_DISCUSSION';
export const DELETE_NOTE = 'DELETE_NOTE'; export const DELETE_NOTE = 'DELETE_NOTE';
export const REMOVE_PLACEHOLDER_NOTES = 'REMOVE_PLACEHOLDER_NOTES'; export const REMOVE_PLACEHOLDER_NOTES = 'REMOVE_PLACEHOLDER_NOTES';
export const SET_NOTES_DATA = 'SET_NOTES_DATA'; export const SET_NOTES_DATA = 'SET_NOTES_DATA';
export const SET_ISSUE_DATA = 'SET_ISSUE_DATA'; export const SET_NOTEABLE_DATA = 'SET_NOTEABLE_DATA';
export const SET_USER_DATA = 'SET_USER_DATA'; export const SET_USER_DATA = 'SET_USER_DATA';
export const SET_INITIAL_NOTES = 'SET_INITIAL_NOTES'; export const SET_INITIAL_NOTES = 'SET_INITIAL_NOTES';
export const SET_LAST_FETCHED_AT = 'SET_LAST_FETCHED_AT'; export const SET_LAST_FETCHED_AT = 'SET_LAST_FETCHED_AT';
......
...@@ -66,8 +66,8 @@ export default { ...@@ -66,8 +66,8 @@ export default {
Object.assign(state, { notesData: data }); Object.assign(state, { notesData: data });
}, },
[types.SET_ISSUE_DATA](state, data) { [types.SET_NOTEABLE_DATA](state, data) {
Object.assign(state, { issueData: data }); Object.assign(state, { noteableData: data });
}, },
[types.SET_USER_DATA](state, data) { [types.SET_USER_DATA](state, data) {
......
...@@ -5,6 +5,11 @@ module Clusters ...@@ -5,6 +5,11 @@ module Clusters
include Gitlab::Kubernetes include Gitlab::Kubernetes
include ReactiveCaching include ReactiveCaching
<<<<<<< HEAD
=======
prepend EE::KubernetesService
>>>>>>> origin/master
self.table_name = 'cluster_platforms_kubernetes' self.table_name = 'cluster_platforms_kubernetes'
self.reactive_cache_key = ->(kubernetes) { [kubernetes.class.model_name.singular, kubernetes.id] } self.reactive_cache_key = ->(kubernetes) { [kubernetes.class.model_name.singular, kubernetes.id] }
...@@ -85,6 +90,19 @@ module Clusters ...@@ -85,6 +90,19 @@ module Clusters
# network access # network access
def calculate_reactive_cache def calculate_reactive_cache
return unless enabled? && project && !project.pending_delete? return unless enabled? && project && !project.pending_delete?
<<<<<<< HEAD
# We may want to cache extra things in the future
{ pods: read_pods }
end
def kubeclient
@kubeclient ||= build_kubeclient!
end
private
=======
# We may want to cache extra things in the future # We may want to cache extra things in the future
{ pods: read_pods } { pods: read_pods }
...@@ -96,12 +114,83 @@ module Clusters ...@@ -96,12 +114,83 @@ module Clusters
private private
>>>>>>> origin/master
def kubeconfig def kubeconfig
to_kubeconfig( to_kubeconfig(
url: api_url, url: api_url,
namespace: actual_namespace, namespace: actual_namespace,
token: token, token: token,
ca_pem: ca_pem) ca_pem: ca_pem)
<<<<<<< HEAD
end
def default_namespace
return unless project
slug = "#{project.path}-#{project.id}".downcase
slug.gsub(/[^-a-z0-9]/, '-').gsub(/^-+/, '')
end
def build_kubeclient!(api_path: 'api', api_version: 'v1')
raise "Incomplete settings" unless api_url && actual_namespace
unless (username && password) || token
raise "Either username/password or token is required to access API"
end
::Kubeclient::Client.new(
join_api_url(api_path),
api_version,
auth_options: kubeclient_auth_options,
ssl_options: kubeclient_ssl_options,
http_proxy_uri: ENV['http_proxy']
)
end
# Returns a hash of all pods in the namespace
def read_pods
kubeclient = build_kubeclient!
kubeclient.get_pods(namespace: actual_namespace).as_json
rescue KubeException => err
raise err unless err.error_code == 404
[]
end
def kubeclient_ssl_options
opts = { verify_ssl: OpenSSL::SSL::VERIFY_PEER }
if ca_pem.present?
opts[:cert_store] = OpenSSL::X509::Store.new
opts[:cert_store].add_cert(OpenSSL::X509::Certificate.new(ca_pem))
end
opts
end
def kubeclient_auth_options
{ bearer_token: token }
end
def join_api_url(api_path)
url = URI.parse(api_url)
prefix = url.path.sub(%r{/+\z}, '')
url.path = [prefix, api_path].join("/")
url.to_s
end
def terminal_auth
{
token: token,
ca_pem: ca_pem,
max_session_time: current_application_settings.terminal_max_session_time
}
end
=======
end end
def default_namespace def default_namespace
...@@ -170,6 +259,7 @@ module Clusters ...@@ -170,6 +259,7 @@ module Clusters
} }
end end
>>>>>>> origin/master
def enforce_namespace_to_lower_case def enforce_namespace_to_lower_case
self.namespace = self.namespace&.downcase self.namespace = self.namespace&.downcase
end end
......
...@@ -146,7 +146,7 @@ class Environment < ActiveRecord::Base ...@@ -146,7 +146,7 @@ class Environment < ActiveRecord::Base
end end
def rollout_status def rollout_status
project.deployment_platform.rollout_status(self) if deployment_service_ready? project.deployment_service.rollout_status(self) if deployment_service_ready?
end end
def has_metrics? def has_metrics?
......
...@@ -23,7 +23,7 @@ class EnvironmentEntity < Grape::Entity ...@@ -23,7 +23,7 @@ class EnvironmentEntity < Grape::Entity
stop_project_environment_path(environment.project, environment) stop_project_environment_path(environment.project, environment)
end end
expose :terminal_path, if: ->(*) { environment.deployment_service_ready? } do |environment| expose :terminal_path, if: ->(*) { environment.has_terminals? } do |environment|
can?(request.current_user, :admin_environment, environment.project) && can?(request.current_user, :admin_environment, environment.project) &&
terminal_project_environment_path(environment.project, environment) terminal_project_environment_path(environment.project, environment)
end end
......
- if environment.deployment_service_ready? && can?(current_user, :admin_environment, @project) - if environment.has_terminals? && can?(current_user, :admin_environment, @project)
= link_to terminal_project_environment_path(@project, environment), class: 'btn terminal-button' do = link_to terminal_project_environment_path(@project, environment), class: 'btn terminal-button' do
= icon('terminal') = icon('terminal')
...@@ -13,5 +13,5 @@ ...@@ -13,5 +13,5 @@
quick_actions_docs_path: help_page_path('user/project/quick_actions'), quick_actions_docs_path: help_page_path('user/project/quick_actions'),
notes_path: notes_url, notes_path: notes_url,
last_fetched_at: Time.now.to_i, last_fetched_at: Time.now.to_i,
issue_data: serialize_issuable(@issue), noteable_data: serialize_issuable(@issue),
current_user_data: UserSerializer.new.represent(current_user).to_json } } current_user_data: UserSerializer.new.represent(current_user).to_json } }
...@@ -7,7 +7,7 @@ module Geo ...@@ -7,7 +7,7 @@ module Geo
end end
def schedule_job(object_db_id, object_type) def schedule_job(object_db_id, object_type)
job_id = GeoFileDownloadWorker.perform_async(object_type, object_db_id) job_id = FileDownloadWorker.perform_async(object_type, object_db_id)
{ id: object_db_id, type: object_type, job_id: job_id } if job_id { id: object_db_id, type: object_type, job_id: job_id } if job_id
end end
......
module Geo
class FileDownloadWorker
include Sidekiq::Worker
sidekiq_options queue: :geo_file_download, retry: 3, dead: false
def perform(object_type, object_id)
Geo::FileDownloadService.new(object_type.to_sym, object_id).execute
end
end
end
...@@ -2,7 +2,7 @@ module Geo ...@@ -2,7 +2,7 @@ module Geo
class ProjectSyncWorker class ProjectSyncWorker
include Sidekiq::Worker include Sidekiq::Worker
sidekiq_options queue: :geo, retry: 3, dead: false sidekiq_options queue: :geo_project_sync, retry: 3, dead: false
sidekiq_retry_in { |count| 30 * count } sidekiq_retry_in { |count| 30 * count }
......
class GeoFileDownloadWorker
include Sidekiq::Worker
include GeoQueue
def perform(object_type, object_id)
Geo::FileDownloadService.new(object_type.to_sym, object_id).execute
end
end
---
title: Fix viewing default push rules on a Geo secondary
merge_request: 3559
author:
type: fixed
---
title: Disable autocomplete for epics
merge_request:
author:
type: fixed
---
title: Fix epic fullscreen editing
merge_request:
author:
type: fixed
---
title: Fix tasklist for epics
merge_request:
author:
type: fixed
---
title: Fix Geo wiki sync error not increasing retry count
merge_request:
author:
type: fixed
---
title: Ensure that rake gitlab:cleanup:repos task does not mess with hashed repositories
merge_request: 15520
author:
type: fixed
---
title: Ensure that rake gitlab:cleanup:dirs task does not mess with hashed repositories
merge_request: 15600
author:
type: fixed
---
title: Fix defaults for MR states and merge statuses
merge_request:
author:
type: fixed
---
title: Fix pulling and pushing using a personal access token with the sudo scope
merge_request:
author:
type: fixed
---
title: Drastically improve project search performance by no longer searching namespace
name
merge_request:
author:
type: performance
---
title: Reuse authors when rendering event Atom feeds
merge_request:
author:
type: performance
---
title: Fix hashed storage for Import/Export uploads
merge_request: 15482
author:
type: fixed
---
title: Fix WIP system note not being created
merge_request:
author:
type: fixed
---
title: Fix link text from group context
merge_request:
author:
type: fixed
---
title: Optimise StuckCiJobsWorker using cheap SQL query outside, and expensive inside
merge_request:
author:
type: performance
...@@ -75,7 +75,8 @@ ...@@ -75,7 +75,8 @@
- [repository_update_remote_mirror, 1] - [repository_update_remote_mirror, 1]
- [project_update_repository_storage, 1] - [project_update_repository_storage, 1]
- [admin_emails, 1] - [admin_emails, 1]
- [geo_repository_update, 1] - [geo_project_sync, 1]
- [geo_file_download, 1]
- [elastic_batch_project_indexer, 1] - [elastic_batch_project_indexer, 1]
- [elastic_indexer, 1] - [elastic_indexer, 1]
- [elastic_commit_indexer, 1] - [elastic_commit_indexer, 1]
......
...@@ -43,9 +43,13 @@ AuthorizedKeysCommand /opt/gitlab-shell/authorized_keys %u %k ...@@ -43,9 +43,13 @@ AuthorizedKeysCommand /opt/gitlab-shell/authorized_keys %u %k
AuthorizedKeysCommandUser git AuthorizedKeysCommandUser git
``` ```
Reload the sshd service: Reload OpenSSH:
``` ```bash
# Debian or Ubuntu installations
sudo service ssh reload
# CentOS installations
sudo service sshd reload sudo service sshd reload
``` ```
......
...@@ -4,50 +4,63 @@ ...@@ -4,50 +4,63 @@
## Legacy Storage ## Legacy Storage
Legacy Storage is the storage behavior prior to version 10.0. For historical reasons, GitLab replicated the same Legacy Storage is the storage behavior prior to version 10.0. For historical
mapping structure from the projects URLs: reasons, GitLab replicated the same mapping structure from the projects URLs:
* Project's repository: `#{namespace}/#{project_name}.git` * Project's repository: `#{namespace}/#{project_name}.git`
* Project's wiki: `#{namespace}/#{project_name}.wiki.git` * Project's wiki: `#{namespace}/#{project_name}.wiki.git`
This structure made simple to migrate from existing solutions to GitLab and easy for Administrators to find where the This structure made it simple to migrate from existing solutions to GitLab and
repository is stored. easy for Administrators to find where the repository is stored.
On the other hand this has some drawbacks: On the other hand this has some drawbacks:
Storage location will concentrate huge amount of top-level namespaces. The impact can be reduced by the introduction of [multiple storage paths][storage-paths]. Storage location will concentrate huge amount of top-level namespaces. The
impact can be reduced by the introduction of [multiple storage
paths][storage-paths].
Because Backups are a snapshot of the same URL mapping, if you try to recover a very old backup, you need to verify Because backups are a snapshot of the same URL mapping, if you try to recover a
if any project has taken the place of an old removed project sharing the same URL. This means that `mygroup/myproject` very old backup, you need to verify whether any project has taken the place of
from your backup may not be the same original project that is today in the same URL. an old removed or renamed project sharing the same URL. This means that
`mygroup/myproject` from your backup may not be the same original project that
is at that same URL today.
Any change in the URL will need to be reflected on disk (when groups / users or projects are renamed). This can add a lot Any change in the URL will need to be reflected on disk (when groups / users or
of load in big installations, and can be even worst if they are using any type of network based filesystem. projects are renamed). This can add a lot of load in big installations,
especially if using any type of network based filesystem.
Last, for GitLab Geo, this storage type means we have to synchronize the disk state, replicate renames in the correct For GitLab Geo in particular: Geo does work with legacy storage, but in some
order or we may end-up with wrong repository or missing data temporarily. edge cases due to race conditions it can lead to errors when a project is
renamed multiple times in short succession, or a project is deleted and
recreated under the same name very quickly. We expect these race events to be
rare, and we have not observed a race condition side-effect happening yet.
This pattern also exists in other objects stored in GitLab, like issue Attachments, GitLab Pages artifacts, This pattern also exists in other objects stored in GitLab, like issue
Docker Containers for the integrated Registry, etc. Attachments, GitLab Pages artifacts, Docker Containers for the integrated
Registry, etc.
## Hashed Storage ## Hashed Storage
Hashed Storage is the new storage behavior we are rolling out with 10.0. It's not enabled by default yet, but we > **Warning:** Hashed storage is in **Alpha**. For the latest updates, check the
encourage everyone to try-it and take the time to fix any script you may have that depends on the old behavior. > associated [issue](https://gitlab.com/gitlab-com/infrastructure/issues/2821)
> and please report any problems you encounter.
Instead of coupling project URL and the folder structure where the repository will be stored on disk, we are coupling Hashed Storage is the new storage behavior we are rolling out with 10.0. Instead
a hash, based on the project's ID. of coupling project URL and the folder structure where the repository will be
stored on disk, we are coupling a hash, based on the project's ID. This makes
the folder structure immutable, and therefore eliminates any requirement to
synchronize state from URLs to disk structure. This means that renaming a group,
user, or project will cost only the database transaction, and will take effect
immediately.
This makes the folder structure immutable, and therefore eliminates any requirement to synchronize state from URLs to The hash also helps to spread the repositories more evenly on the disk, so the
disk structure. This means that renaming a group, user or project will cost only the database transaction, and will take top-level directory will contain less folders than the total amount of top-level
effect immediately. namespaces.
The hash also helps to spread the repositories more evenly on the disk, so the top-level directory will contain less The hash format is based on the hexadecimal representation of SHA256:
folders than the total amount of top-level namespaces. `SHA256(project.id)`. The top-level folder uses the first 2 characters, followed
by another folder with the next 2 characters. They are both stored in a special
Hash format is based on hexadecimal representation of SHA256: `SHA256(project.id)`. `@hashed` folder, to be able to co-exist with existing Legacy Storage projects:
Top-level folder uses first 2 characters, followed by another folder with the next 2 characters. They are both stored in
a special folder `@hashed`, to co-exist with existing Legacy projects:
```ruby ```ruby
# Project's repository: # Project's repository:
...@@ -57,15 +70,13 @@ a special folder `@hashed`, to co-exist with existing Legacy projects: ...@@ -57,15 +70,13 @@ a special folder `@hashed`, to co-exist with existing Legacy projects:
"@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.wiki.git" "@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.wiki.git"
``` ```
This new format also makes possible to restore backups with confidence, as when restoring a repository from the backup,
you will never mistakenly restore a repository in the wrong project (considering the backup is made after the migration).
### How to migrate to Hashed Storage ### How to migrate to Hashed Storage
In GitLab, go to **Admin > Settings**, find the **Repository Storage** section and select In GitLab, go to **Admin > Settings**, find the **Repository Storage** section
"_Create new projects using hashed storage paths_". and select "_Create new projects using hashed storage paths_".
To migrate your existing projects to the new storage type, check the specific [rake tasks]. To migrate your existing projects to the new storage type, check the specific
[rake tasks].
[ce-28283]: https://gitlab.com/gitlab-org/gitlab-ce/issues/28283 [ce-28283]: https://gitlab.com/gitlab-org/gitlab-ce/issues/28283
[rake tasks]: raketasks/storage.md#migrate-existing-projects-to-hashed-storage [rake tasks]: raketasks/storage.md#migrate-existing-projects-to-hashed-storage
...@@ -73,11 +84,13 @@ To migrate your existing projects to the new storage type, check the specific [r ...@@ -73,11 +84,13 @@ To migrate your existing projects to the new storage type, check the specific [r
### Hashed Storage coverage ### Hashed Storage coverage
We are incrementally moving every storable object in GitLab to the Hashed Storage pattern. You can check the current We are incrementally moving every storable object in GitLab to the Hashed
coverage status below. Storage pattern. You can check the current coverage status below (and also see
the [issue](https://gitlab.com/gitlab-com/infrastructure/issues/2821)).
Note that things stored in an S3 compatible endpoint will not have the downsides mentioned earlier, if they are not Note that things stored in an S3 compatible endpoint will not have the downsides
prefixed with `#{namespace}/#{project_name}`, which is true for CI Cache and LFS Objects. mentioned earlier, if they are not prefixed with `#{namespace}/#{project_name}`,
which is true for CI Cache and LFS Objects.
| Storable Object | Legacy Storage | Hashed Storage | S3 Compatible | GitLab Version | | Storable Object | Legacy Storage | Hashed Storage | S3 Compatible | GitLab Version |
| --------------- | -------------- | -------------- | ------------- | -------------- | | --------------- | -------------- | -------------- | ------------- | -------------- |
......
...@@ -87,16 +87,12 @@ Meanwhile, the primary node will start to notify changes to the secondary, which ...@@ -87,16 +87,12 @@ Meanwhile, the primary node will start to notify changes to the secondary, which
will act on those notifications immediately. Make sure the secondary instance is will act on those notifications immediately. Make sure the secondary instance is
running and accessible. running and accessible.
### Step 2. Enabling hashed storage (from GitLab 10.0) ### Step 2. Enabling hashed storage (optional, from GitLab 10.0)
>**Warning** >**Warning**
Hashed storage is in **Beta**. It is considered experimental and not Hashed storage is in **Alpha**. It is considered experimental and not
production-ready. For the latest updates, check production-ready. See [Hashed
[issue](https://gitlab.com/gitlab-com/infrastructure/issues/2821). Storage](../administration/repository_storage_types.md) for more detail.
Hashed Storage is not required to run GitLab Geo, but in some edge cases race
conditions can lead to errors and Geo to break. Known issues are renaming a
project multiple times in short succession, deleting a project and recreating
with the same name very quickly.
Using hashed storage significantly improves Geo replication - project and group Using hashed storage significantly improves Geo replication - project and group
renames no longer require synchronization between nodes. renames no longer require synchronization between nodes.
......
...@@ -91,21 +91,12 @@ primary in a process known as backfill. Meanwhile, the primary node will start ...@@ -91,21 +91,12 @@ primary in a process known as backfill. Meanwhile, the primary node will start
to notify changes to the secondary, which will act on those notifications to notify changes to the secondary, which will act on those notifications
immediately. Make sure the secondary instance is running and accessible. immediately. Make sure the secondary instance is running and accessible.
### Step 2. Enabling hashed storage (from GitLab 10.0) ### Step 2. Enabling hashed storage (optional, GitLab 10.0)
>**Note:** >**Warning**
Hashed storage is in **Beta**. It is considered experimental and not Hashed storage is in **Alpha**. It is considered experimental and not
production-ready. For the latest updates, check production-ready. See [Hashed
[issue](https://gitlab.com/gitlab-com/infrastructure/issues/2821). Storage](../administration/repository_storage_types.md) for more detail.
Hashed Storage is not required to run GitLab Geo, but in some edge cases race
conditions can lead to errors and Geo to break. Known issues are renaming a
project multiple times in short succession, deleting a project and recreating
with the same name very quickly.
>**Note:**
Instances already using hashed storage are not recommended to disable hashed
storage, since bugs affecting hashed storage would continue to affect these
projects.
Using hashed storage significantly improves Geo replication - project and group Using hashed storage significantly improves Geo replication - project and group
renames no longer require synchronization between nodes. renames no longer require synchronization between nodes.
......
...@@ -26,7 +26,7 @@ connect to secondary database servers (which are read-only too). ...@@ -26,7 +26,7 @@ connect to secondary database servers (which are read-only too).
In many databases documentation you will see "primary" being referenced as "master" In many databases documentation you will see "primary" being referenced as "master"
and "secondary" as either "slave" or "standby" server (read-only). and "secondary" as either "slave" or "standby" server (read-only).
Since GitLab 9.4: We recommend using [PostgreSQL replication We recommend using [PostgreSQL replication
slots](https://medium.com/@tk512/replication-slots-in-postgresql-b4b03d277c75) slots](https://medium.com/@tk512/replication-slots-in-postgresql-b4b03d277c75)
to ensure the primary retains all the data necessary for the secondaries to to ensure the primary retains all the data necessary for the secondaries to
recover. See below for more details. recover. See below for more details.
...@@ -80,6 +80,7 @@ will not be able to perform all necessary configuration steps. Refer to ...@@ -80,6 +80,7 @@ will not be able to perform all necessary configuration steps. Refer to
else. else.
1. Set up TLS support for the PostgreSQL primary server 1. Set up TLS support for the PostgreSQL primary server
> **Warning**: Only skip this step if you **know** that PostgreSQL traffic > **Warning**: Only skip this step if you **know** that PostgreSQL traffic
> between the primary and secondary will be secured through some other > between the primary and secondary will be secured through some other
> means, e.g., a known-safe physical network path or a site-to-site VPN that > means, e.g., a known-safe physical network path or a site-to-site VPN that
...@@ -146,104 +147,115 @@ will not be able to perform all necessary configuration steps. Refer to ...@@ -146,104 +147,115 @@ will not be able to perform all necessary configuration steps. Refer to
postgresql['ssl'] = 'on' postgresql['ssl'] = 'on'
``` ```
1. Configure PostgreSQL to listen on an external network interface 1. Configure PostgreSQL to listen on network interfaces
Edit `/etc/gitlab/gitlab.rb` and add the following. Note that GitLab 9.1 added For security reasons, PostgreSQL does not listen on any network interfaces
the `geo_primary_role` configuration variable: by default. However, GitLab Geo requires the secondary to be able to
connect to the primary's database. For this reason, we need the address of
each node.
```ruby If you are using a cloud provider, you can lookup the addresses for each
geo_primary_role['enable'] = true Geo node through their management console. A table of terminology is
postgresql['listen_address'] = '1.2.3.4' provided below because terminology varies between vendors.
postgresql['trust_auth_cidr_addresses'] = ['127.0.0.1/32','1.2.3.4/32']
postgresql['md5_auth_cidr_addresses'] = ['5.6.7.8/32']
# New for 9.4: Set this to be the number of Geo secondary nodes you have
postgresql['max_replication_slots'] = 1
# postgresql['max_wal_senders'] = 10
# postgresql['wal_keep_segments'] = 10
```
For external PostgreSQL instances, [see additional instructions][external postgresql]. | GitLab Terminology | Amazon Web Services | Google Cloud Platform |
|-----|-----|-----|-----|
| Interface address | Private address | Internal address |
| Public address | Public address | External address |
To lookup the address of a Geo node, on the Geo node execute:
Where `1.2.3.4` is the IP address of the primary server, and `5.6.7.8` ```bash
is the IP address of the secondary one. # Interface address
ip route get 255.255.255.255 | awk '{print $NF; exit}'
For security reasons, PostgreSQL by default only listens on the local # Public address
interface (e.g. 127.0.0.1). However, GitLab Geo needs to communicate curl ipinfo.io/ip
between the primary and secondary nodes over a common network, such as a ```
corporate LAN or the public Internet. For this reason, we need to
configure PostgreSQL to listen on more interfaces.
The `listen_address` option opens PostgreSQL up to external connections In most cases, the following addresses will be used to configure GitLab
with the interface corresponding to the given IP. See [the PostgreSQL Geo:
documentation](https://www.postgresql.org/docs/9.6/static/runtime-config-connection.html)
for more details.
Note that if you are running GitLab Geo with a cloud provider (e.g. Amazon | Configuration | Address |
Web Services), the internal interface IP (as provided by `ifconfig`) may |-----|-----|
be different from the public IP address. For example, suppose you have a | `postgresql['listen_address']` | Primary's interface address |
nodes with the following configuration: | `postgresql['trust_auth_cidr_addresses']` | Primary's interface address |
| `postgresql['md5_auth_cidr_addresses']` | Secondary's public addresses |
|Node Type|Internal IP|External IP| The `listen_address` option opens PostgreSQL up to network connections
|---------|-----------|-----------| with the interface corresponding to the given address. See [the PostgreSQL
|Primary|10.1.5.3|54.193.124.100| documentation](https://www.postgresql.org/docs/9.6/static/runtime-config-connection.html)
|Secondary|10.1.10.5|54.193.100.155| for more details.
If you are running two nodes in different cloud availability zones, you Depending on your network configuration, the suggested addresses may not
may need to double check that the nodes can communicate over the internal be correct. If your primary and secondary connect over a local
IP addresses. For example, servers on Amazon Web Services in the same area network, or a virtual network connecting availability zones like
[Virtual Private Cloud (VPC)](https://aws.amazon.com/vpc/) can do Amazon's [VPC](https://aws.amazon.com/vpc/) of Google's [VPC](https://cloud.google.com/vpc/)
this. Google Compute Engine also offers an [internal network] you should use the secondary's interface address for `postgresql['md5_auth_cidr_addresses']`.
(https://cloud.google.com/compute/docs/networking) that supports
cross-availability zone networking.
For the above example, the following configuration uses the internal IPs Edit `/etc/gitlab/gitlab.rb` and add the following, replacing the IP
to replicate the database from the primary to the secondary: addresses with addresses appropriate to your network configuration:
```ruby ```ruby
# Example configuration using internal IPs for a cloud configuration
geo_primary_role['enable'] = true geo_primary_role['enable'] = true
postgresql['listen_address'] = '10.1.5.3'
postgresql['trust_auth_cidr_addresses'] = ['127.0.0.1/32','10.1.5.3/32'] # Primary address
postgresql['md5_auth_cidr_addresses'] = ['10.1.10.5/32'] # - replace '1.2.3.4' with the primary interface address
postgresql['max_replication_slots'] = 1 # Number of Geo secondary nodes postgresql['listen_address'] = '1.2.3.4'
postgresql['trust_auth_cidr_addresses'] = ['127.0.0.1/32','1.2.3.4/32']
# Secondary addresses
# - replace '5.6.7.8' with the secondary public address
postgresql['md5_auth_cidr_addresses'] = ['5.6.7.8/32']
# Replication settings
# - set this to be the number of Geo secondary nodes you have
postgresql['max_replication_slots'] = 1
# postgresql['max_wal_senders'] = 10 # postgresql['max_wal_senders'] = 10
# postgresql['wal_keep_segments'] = 10 # postgresql['wal_keep_segments'] = 10
# Disable automatic database migrations for now
# (until PostgreSQL is restarted and listening on the interface address)
gitlab_rails['auto_migrate'] = false
``` ```
If you prefer that your nodes communicate over the public Internet, you For external PostgreSQL instances, [see additional instructions][external postgresql].
may choose the IP addresses from the "External IP" column above.
1. Optional: If you want to add another secondary, the relevant setting would look like: 1. Optional: If you want to add another secondary, the relevant setting would look like:
```ruby ```ruby
postgresql['md5_auth_cidr_addresses'] = ['5.6.7.8/32','11.22.33.44/32'] postgresql['md5_auth_cidr_addresses'] = ['5.6.7.8/32','9.10.11.12/32']
``` ```
You may also want to edit the `wal_keep_segments` and `max_wal_senders` to You may also want to edit the `wal_keep_segments` and `max_wal_senders` to
match your database replication requirements. Consult the [PostgreSQL - Replication documentation](https://www.postgresql.org/docs/9.6/static/runtime-config-replication.html) match your database replication requirements. Consult the [PostgreSQL -
Replication documentation](https://www.postgresql.org/docs/9.6/static/runtime-config-replication.html)
for more information. for more information.
1. Save the file and [reconfigure GitLab][] for the database listen changes to 1. Save the file and [reconfigure GitLab][] for the database listen changes and
take effect. the replication slot changes to be applied.
**This step will fail.** This is caused by
[Omnibus#2797](https://gitlab.com/gitlab-org/omnibus-gitlab/issues/2797).
Restart PostgreSQL: Restart PostgreSQL for its changes to take effect:
```bash ```bash
gitlab-ctl restart postgresql gitlab-ctl restart postgresql
``` ```
[Reconfigure GitLab][reconfigure GitLab] again. It should complete cleanly. 1. Reenable migrations
Edit `/etc/gitlab/gitlab.rb` and **delete** the following lines:
```ruby
# Disable automatic database migrations for now
# (until PostgreSQL is restarted and listening on the interface address)
gitlab_rails['auto_migrate'] = false
```
1. New for 9.4: Restart your primary PostgreSQL server to ensure the Save the file and [reconfigure GitLab][].
replication slot changes take effect (`sudo gitlab-ctl restart postgresql`
for Omnibus-provided PostgreSQL).
1. Now that the PostgreSQL server is set up to accept remote connections, run 1. Now that the PostgreSQL server is set up to accept remote connections, run
`netstat -plnt` to make sure that PostgreSQL is listening on port `5432` to `netstat -plnt` to make sure that PostgreSQL is listening on port `5432` to
the server's public IP. the server's interface address.
1. Verify that clock synchronization is enabled. 1. Verify that clock synchronization is enabled.
......
...@@ -53,18 +53,29 @@ secondary if ever promoted to a primary: ...@@ -53,18 +53,29 @@ secondary if ever promoted to a primary:
sudo -u git -H rm ~git/.ssh/id_rsa ~git/.ssh/id_rsa.pub sudo -u git -H rm ~git/.ssh/id_rsa ~git/.ssh/id_rsa.pub
``` ```
### Hashed Storage
>**Warning**
Hashed storage is in **Alpha**. It is considered experimental and not
production-ready. See [Hashed
Storage](../administration/repository_storage_types.md) for more detail.
If you previously enabled Hashed Storage and migrated all your existing
projects to Hashed Storage, disabling hashed storage will not migrate projects
to their previous project based storage path. As such, once enabled and
migrated we recommend leaving Hashed Storage enabled.
## Upgrading to GitLab 10.1 ## Upgrading to GitLab 10.1
>**Warning**
Hashed storage is in **Alpha**. It is considered experimental and not
production-ready. See [Hashed
Storage](../administration/repository_storage_types.md) for more detail.
[Hashed storage](../administration/repository_storage_types.md) was introduced [Hashed storage](../administration/repository_storage_types.md) was introduced
in GitLab 10.0, and a [migration path](../administration/raketasks/storage.md) in GitLab 10.0, and a [migration path](../administration/raketasks/storage.md)
for existing repositories was added in GitLab 10.1. for existing repositories was added in GitLab 10.1.
After upgrading to GitLab 10.1, we recommend that you
[enable hashed storage for all new projects](#step-5-enabling-hashed-storage-from-gitlab-100),
then [migrate existing projects to hashed storage](../administration/raketasks/storage.md).
This will significantly reduce the amount of synchronization required between
nodes in the event of project or group renames.
## Upgrading to GitLab 10.0 ## Upgrading to GitLab 10.0
Since GitLab 10.0, we require all **Geo** systems to [use SSH key lookups via Since GitLab 10.0, we require all **Geo** systems to [use SSH key lookups via
......
...@@ -22,7 +22,7 @@ Among numerous use cases for exporting issues for CSV, we can name a few: ...@@ -22,7 +22,7 @@ Among numerous use cases for exporting issues for CSV, we can name a few:
- Make a snapshot of issues for offline analysis or to communicate with other teams who may not be in GitLab - Make a snapshot of issues for offline analysis or to communicate with other teams who may not be in GitLab
- Create diagrams, graphs, and charts from the CSV data - Create diagrams, graphs, and charts from the CSV data
- Present the data in any other format for auditing or sharing reasons - Present the data in any other format for auditing or sharing reasons
- Import the issues elsewhere - Import the issues elsewhere to a system outside of GitLab
- Long-term issues' data analysis with multiple snapshots created along the time - Long-term issues' data analysis with multiple snapshots created along the time
- Use the long-term data to gather relevant feedback given in the issues, and improve your product based on real metrics - Use the long-term data to gather relevant feedback given in the issues, and improve your product based on real metrics
......
...@@ -3,7 +3,7 @@ msgstr "" ...@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: gitlab-ee\n" "Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-02 14:42+0100\n" "POT-Creation-Date: 2017-11-02 14:42+0100\n"
"PO-Revision-Date: 2017-11-03 12:30-0400\n" "PO-Revision-Date: 2017-11-28 11:32-0500\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: German\n" "Language-Team: German\n"
"Language: de_DE\n" "Language: de_DE\n"
...@@ -2070,7 +2070,7 @@ msgid "Time until first merge request" ...@@ -2070,7 +2070,7 @@ msgid "Time until first merge request"
msgstr "Zeit bis zum ersten Merge Request" msgstr "Zeit bis zum ersten Merge Request"
msgid "Timeago|%s days ago" msgid "Timeago|%s days ago"
msgstr "" msgstr "vor %s Tagen"
msgid "Timeago|%s days remaining" msgid "Timeago|%s days remaining"
msgstr "%s Tage verbleibend" msgstr "%s Tage verbleibend"
......
...@@ -3,7 +3,7 @@ msgstr "" ...@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: gitlab-ee\n" "Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-02 14:42+0100\n" "POT-Creation-Date: 2017-11-02 14:42+0100\n"
"PO-Revision-Date: 2017-11-03 12:30-0400\n" "PO-Revision-Date: 2017-11-21 16:43-0500\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: French\n" "Language-Team: French\n"
"Language: fr_FR\n" "Language: fr_FR\n"
...@@ -36,8 +36,8 @@ msgstr "%{commit_author_link} a validé %{commit_timeago}" ...@@ -36,8 +36,8 @@ msgstr "%{commit_author_link} a validé %{commit_timeago}"
msgid "%{count} participant" msgid "%{count} participant"
msgid_plural "%{count} participants" msgid_plural "%{count} participants"
msgstr[0] "" msgstr[0] "%{count} participant•e"
msgstr[1] "" msgstr[1] "%{count} participant•e•s"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} validations de retard sur %{default_branch}, %{number_commits_ahead} validations d'avance" msgstr "%{number_commits_behind} validations de retard sur %{default_branch}, %{number_commits_ahead} validations d'avance"
...@@ -60,10 +60,10 @@ msgid "(checkout the %{link} for information on how to install it)." ...@@ -60,10 +60,10 @@ msgid "(checkout the %{link} for information on how to install it)."
msgstr "(Lisez %{link} pour savoir comment l'installer)." msgstr "(Lisez %{link} pour savoir comment l'installer)."
msgid "+ %{moreCount} more" msgid "+ %{moreCount} more"
msgstr "" msgstr "+ %{moreCount} de plus"
msgid "- show less" msgid "- show less"
msgstr "" msgstr "- en montrer moins"
msgid "1 pipeline" msgid "1 pipeline"
msgid_plural "%d pipelines" msgid_plural "%d pipelines"
...@@ -125,7 +125,7 @@ msgid "AdminHealthPageLink|health page" ...@@ -125,7 +125,7 @@ msgid "AdminHealthPageLink|health page"
msgstr "État des services" msgstr "État des services"
msgid "Advanced settings" msgid "Advanced settings"
msgstr "" msgstr "Paramètres avancés"
msgid "All" msgid "All"
msgstr "Tous" msgstr "Tous"
...@@ -625,8 +625,8 @@ msgstr[1] "Validations" ...@@ -625,8 +625,8 @@ msgstr[1] "Validations"
msgid "Commit %d file" msgid "Commit %d file"
msgid_plural "Commit %d files" msgid_plural "Commit %d files"
msgstr[0] "" msgstr[0] "Valider %d fichier"
msgstr[1] "" msgstr[1] "Valider %d fichiers"
msgid "Commit Message" msgid "Commit Message"
msgstr "Message de validation" msgstr "Message de validation"
...@@ -692,10 +692,10 @@ msgid "ContainerRegistry|Size" ...@@ -692,10 +692,10 @@ msgid "ContainerRegistry|Size"
msgstr "Taille" msgstr "Taille"
msgid "ContainerRegistry|Tag" msgid "ContainerRegistry|Tag"
msgstr "Étiquette" msgstr "Tag"
msgid "ContainerRegistry|Tag ID" msgid "ContainerRegistry|Tag ID"
msgstr "ID d‘étiquette" msgstr "ID du tag"
msgid "ContainerRegistry|Use different image names" msgid "ContainerRegistry|Use different image names"
msgstr "Utilisez des noms d’images différents" msgstr "Utilisez des noms d’images différents"
...@@ -704,7 +704,7 @@ msgid "ContainerRegistry|With the Docker Container Registry integrated into GitL ...@@ -704,7 +704,7 @@ msgid "ContainerRegistry|With the Docker Container Registry integrated into GitL
msgstr "Avec le registre de conteneur Docker intégré à GitLab, chaque projet peut avoir son propre espace pour stocker ses images Docker." msgstr "Avec le registre de conteneur Docker intégré à GitLab, chaque projet peut avoir son propre espace pour stocker ses images Docker."
msgid "Contribution guide" msgid "Contribution guide"
msgstr "Guilde de contribution" msgstr "Guide de contribution"
msgid "Contributors" msgid "Contributors"
msgstr "Contributeurs" msgstr "Contributeurs"
...@@ -737,7 +737,7 @@ msgid "Create empty bare repository" ...@@ -737,7 +737,7 @@ msgid "Create empty bare repository"
msgstr "Créer un dépôt vide" msgstr "Créer un dépôt vide"
msgid "Create file" msgid "Create file"
msgstr "" msgstr "Créer un fichier"
msgid "Create merge request" msgid "Create merge request"
msgstr "Créer une demande de fusion" msgstr "Créer une demande de fusion"
...@@ -746,10 +746,10 @@ msgid "Create new branch" ...@@ -746,10 +746,10 @@ msgid "Create new branch"
msgstr "Créer une nouvelle branche" msgstr "Créer une nouvelle branche"
msgid "Create new directory" msgid "Create new directory"
msgstr "" msgstr "Créer un nouveau dossier"
msgid "Create new file" msgid "Create new file"
msgstr "" msgstr "Créer un nouveau fichier"
msgid "Create new..." msgid "Create new..."
msgstr "Créer nouveau..." msgstr "Créer nouveau..."
...@@ -922,7 +922,7 @@ msgid "Failed to remove the pipeline schedule" ...@@ -922,7 +922,7 @@ msgid "Failed to remove the pipeline schedule"
msgstr "Échec de la suppression du pipeline programmé" msgstr "Échec de la suppression du pipeline programmé"
msgid "File name" msgid "File name"
msgstr "" msgstr "Nom du fichier"
msgid "Files" msgid "Files"
msgstr "Fichiers" msgstr "Fichiers"
...@@ -1364,10 +1364,10 @@ msgid "Notifications" ...@@ -1364,10 +1364,10 @@ msgid "Notifications"
msgstr "Notifications" msgstr "Notifications"
msgid "Number of access attempts" msgid "Number of access attempts"
msgstr "" msgstr "Nombre de tentatives d'accès"
msgid "Number of failures before backing off" msgid "Number of failures before backing off"
msgstr "" msgstr "Nombre d'échecs avant annulation"
msgid "OfSearchInADropdown|Filter" msgid "OfSearchInADropdown|Filter"
msgstr "Filtre" msgstr "Filtre"
...@@ -1625,7 +1625,7 @@ msgid "ProjectSettings|This setting will be applied to all projects unless overr ...@@ -1625,7 +1625,7 @@ msgid "ProjectSettings|This setting will be applied to all projects unless overr
msgstr "Ce paramètre s’appliquera à tous les projets à moins qu’un administrateur ne le modifie." msgstr "Ce paramètre s’appliquera à tous les projets à moins qu’un administrateur ne le modifie."
msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr "" msgstr "Les utilisateurs peuvent uniquement pousser sur ce dépôt des validations qui ont été validées avec une de leurs adresses courriels vérifiées."
msgid "Projects" msgid "Projects"
msgstr "Projets" msgstr "Projets"
...@@ -1664,7 +1664,7 @@ msgid "Push events" ...@@ -1664,7 +1664,7 @@ msgid "Push events"
msgstr "Évènements de poussée" msgstr "Évènements de poussée"
msgid "PushRule|Committer restriction" msgid "PushRule|Committer restriction"
msgstr "" msgstr "Restriction du validateur"
msgid "Read more" msgid "Read more"
msgstr "Lire plus" msgstr "Lire plus"
...@@ -1682,7 +1682,7 @@ msgid "Registry" ...@@ -1682,7 +1682,7 @@ msgid "Registry"
msgstr "Registre" msgstr "Registre"
msgid "Related Commits" msgid "Related Commits"
msgstr "Validations liés" msgstr "Validations liées"
msgid "Related Deployed Jobs" msgid "Related Deployed Jobs"
msgstr "Tâches de déploiement liées" msgstr "Tâches de déploiement liées"
...@@ -1730,7 +1730,7 @@ msgid "SSH Keys" ...@@ -1730,7 +1730,7 @@ msgid "SSH Keys"
msgstr "Clés SSH" msgstr "Clés SSH"
msgid "Save" msgid "Save"
msgstr "" msgstr "Enregistrer"
msgid "Save changes" msgid "Save changes"
msgstr "Enregistrer les modifications" msgstr "Enregistrer les modifications"
...@@ -1939,10 +1939,10 @@ msgid "Subgroups" ...@@ -1939,10 +1939,10 @@ msgid "Subgroups"
msgstr "Sous-groupes" msgstr "Sous-groupes"
msgid "Subscribe" msgid "Subscribe"
msgstr "" msgstr "S’abonner"
msgid "Switch branch/tag" msgid "Switch branch/tag"
msgstr "Changer de branche / d'étiquette" msgstr "Changer de branche / tag"
msgid "System Hooks" msgid "System Hooks"
msgstr "Crochets système" msgstr "Crochets système"
...@@ -1968,7 +1968,7 @@ msgid "The Advanced Global Search in GitLab is a powerful search service that sa ...@@ -1968,7 +1968,7 @@ msgid "The Advanced Global Search in GitLab is a powerful search service that sa
msgstr "La Recherche Globale Avancée de GitLab est un outils qui vous fait gagner du temps. Au lieu de créer du code similaire et perdre du temps, vous pouvez maintenant chercher dans le code d'autres équipes pour vous aider sur votre projet." msgstr "La Recherche Globale Avancée de GitLab est un outils qui vous fait gagner du temps. Au lieu de créer du code similaire et perdre du temps, vous pouvez maintenant chercher dans le code d'autres équipes pour vous aider sur votre projet."
msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
msgstr "" msgstr "Le seuil d’interruption du disjoncteur devrait être inférieur au seuil de nombre de défaillance"
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "L’étape de développement montre le temps entre la première validation et la création de la demande de fusion. Les données seront automatiquement ajoutées ici une fois que vous aurez créé votre première demande de fusion." msgstr "L’étape de développement montre le temps entre la première validation et la création de la demande de fusion. Les données seront automatiquement ajoutées ici une fois que vous aurez créé votre première demande de fusion."
...@@ -1983,10 +1983,10 @@ msgid "The issue stage shows the time it takes from creating an issue to assigni ...@@ -1983,10 +1983,10 @@ msgid "The issue stage shows the time it takes from creating an issue to assigni
msgstr "L'étape des tickets montre le temps nécessaire entre la création d'un ticket et son assignation à un jalon, ou son ajout à une liste d'un tableau de tickets. Commencez par créer des tickets pour voir des données pour cette étape." msgstr "L'étape des tickets montre le temps nécessaire entre la création d'un ticket et son assignation à un jalon, ou son ajout à une liste d'un tableau de tickets. Commencez par créer des tickets pour voir des données pour cette étape."
msgid "The number of attempts GitLab will make to access a storage." msgid "The number of attempts GitLab will make to access a storage."
msgstr "" msgstr "Le nombre de tentatives que GitLab va effectuer pour accéder au stockage."
msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
msgstr "" msgstr "Le nombre d'échecs avant que GitLab ne commence à désactiver l'accès à la partition de stockage sur l'hôte"
msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
msgstr "Nombre d’échecs avant que GitLab n’empêche tout accès au stockage. Ce nombre d’échecs peut être réinitialisé dans l’interface d’administration : %{link_to_health_page} ou en suivant le %{api_documentation_link}." msgstr "Nombre d’échecs avant que GitLab n’empêche tout accès au stockage. Ce nombre d’échecs peut être réinitialisé dans l’interface d’administration : %{link_to_health_page} ou en suivant le %{api_documentation_link}."
...@@ -2224,7 +2224,7 @@ msgid "Unstar" ...@@ -2224,7 +2224,7 @@ msgid "Unstar"
msgstr "Supprimer des favoris" msgstr "Supprimer des favoris"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "" msgstr "Se désabonner"
msgid "Upgrade your plan to activate Advanced Global Search." msgid "Upgrade your plan to activate Advanced Global Search."
msgstr "Mettez à jour votre abonnement pour activer la Recherche Globale Avancée." msgstr "Mettez à jour votre abonnement pour activer la Recherche Globale Avancée."
......
...@@ -3,7 +3,7 @@ msgstr "" ...@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: gitlab-ee\n" "Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-02 14:42+0100\n" "POT-Creation-Date: 2017-11-02 14:42+0100\n"
"PO-Revision-Date: 2017-11-03 12:31-0400\n" "PO-Revision-Date: 2017-11-20 03:59-0500\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Italian\n" "Language-Team: Italian\n"
"Language: it_IT\n" "Language: it_IT\n"
...@@ -2085,7 +2085,7 @@ msgid "Timeago|%s minutes remaining" ...@@ -2085,7 +2085,7 @@ msgid "Timeago|%s minutes remaining"
msgstr "%s minuti rimanenti" msgstr "%s minuti rimanenti"
msgid "Timeago|%s months ago" msgid "Timeago|%s months ago"
msgstr "%s minuti fa" msgstr "%s mesi fa"
msgid "Timeago|%s months remaining" msgid "Timeago|%s months remaining"
msgstr "%s mesi rimanenti" msgstr "%s mesi rimanenti"
......
msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-02 14:42+0100\n"
"PO-Revision-Date: 2017-11-20 11:16-0500\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Polish\n"
"Language: pl_PL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "%d layer"
msgid_plural "%d layers"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr ""
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr ""
msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt."
msgstr ""
msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will block access for %{number_of_seconds} seconds."
msgstr ""
msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved."
msgstr ""
msgid "%{storage_name}: failed storage access attempt on host:"
msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "(checkout the %{link} for information on how to install it)."
msgstr ""
msgid "+ %{moreCount} more"
msgstr ""
msgid "- show less"
msgstr ""
msgid "1 pipeline"
msgid_plural "%d pipelines"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "1st contribution!"
msgstr ""
msgid "2FA enabled"
msgstr ""
msgid "A collection of graphs regarding Continuous Integration"
msgstr ""
msgid "About auto deploy"
msgstr ""
msgid "Abuse Reports"
msgstr ""
msgid "Access Tokens"
msgstr ""
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr ""
msgid "Account"
msgstr ""
msgid "Active"
msgstr ""
msgid "Activity"
msgstr ""
msgid "Add"
msgstr ""
msgid "Add Changelog"
msgstr ""
msgid "Add Contribution guide"
msgstr ""
msgid "Add Group Webhooks and GitLab Enterprise Edition."
msgstr ""
msgid "Add License"
msgstr ""
msgid "Add an SSH key to your profile to pull or push via SSH."
msgstr ""
msgid "Add new directory"
msgstr ""
msgid "AdminHealthPageLink|health page"
msgstr ""
msgid "Advanced settings"
msgstr ""
msgid "All"
msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
msgid "Appearance"
msgstr ""
msgid "Applications"
msgstr ""
msgid "Archived project! Repository is read-only"
msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr ""
msgid "Are you sure you want to discard your changes?"
msgstr ""
msgid "Are you sure you want to leave this group?"
msgstr ""
msgid "Are you sure you want to reset registration token?"
msgstr ""
msgid "Are you sure you want to reset the health check token?"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Artifacts"
msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr ""
msgid "Authentication Log"
msgstr ""
msgid "Author"
msgstr ""
msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly."
msgstr ""
msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly."
msgstr ""
msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly."
msgstr ""
msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr ""
msgid "AutoDevOps|Auto DevOps documentation"
msgstr ""
msgid "AutoDevOps|Enable in settings"
msgstr ""
msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
msgstr ""
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr ""
msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
msgstr ""
msgid "Billing"
msgstr ""
msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
msgstr ""
msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
msgstr ""
msgid "BillingPlans|Current plan"
msgstr ""
msgid "BillingPlans|Customer Support"
msgstr ""
msgid "BillingPlans|Downgrade"
msgstr ""
msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
msgstr ""
msgid "BillingPlans|Manage plan"
msgstr ""
msgid "BillingPlans|Please contact %{customer_support_link} in that case."
msgstr ""
msgid "BillingPlans|See all %{plan_name} features"
msgstr ""
msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr ""
msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
msgstr ""
msgid "BillingPlans|Upgrade"
msgstr ""
msgid "BillingPlans|You are currently on the %{plan_link} plan."
msgstr ""
msgid "BillingPlans|frequently asked questions"
msgstr ""
msgid "BillingPlans|monthly"
msgstr ""
msgid "BillingPlans|paid annually at %{price_per_year}"
msgstr ""
msgid "BillingPlans|per user"
msgstr ""
msgid "Branch"
msgid_plural "Branches"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr ""
msgid "Branch has changed"
msgstr ""
msgid "BranchSwitcherPlaceholder|Search branches"
msgstr ""
msgid "BranchSwitcherTitle|Switch branch"
msgstr ""
msgid "Branches"
msgstr ""
msgid "Branches|Cant find HEAD commit for this branch"
msgstr ""
msgid "Branches|Compare"
msgstr ""
msgid "Branches|Delete all branches that are merged into '%{default_branch}'"
msgstr ""
msgid "Branches|Delete branch"
msgstr ""
msgid "Branches|Delete merged branches"
msgstr ""
msgid "Branches|Delete protected branch"
msgstr ""
msgid "Branches|Delete protected branch '%{branch_name}'?"
msgstr ""
msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?"
msgstr ""
msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?"
msgstr ""
msgid "Branches|Filter by branch name"
msgstr ""
msgid "Branches|Merged into %{default_branch}"
msgstr ""
msgid "Branches|New branch"
msgstr ""
msgid "Branches|No branches to show"
msgstr ""
msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered."
msgstr ""
msgid "Branches|Only a project master or owner can delete a protected branch"
msgstr ""
msgid "Branches|Protected branches can be managed in %{project_settings_link}"
msgstr ""
msgid "Branches|Sort by"
msgstr ""
msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
msgstr ""
msgid "Branches|The default branch cannot be deleted"
msgstr ""
msgid "Branches|This branch hasn’t been merged into %{default_branch}."
msgstr ""
msgid "Branches|To avoid data loss, consider merging this branch before deleting it."
msgstr ""
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr ""
msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
msgstr ""
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr ""
msgid "Branches|diverged from upstream"
msgstr ""
msgid "Branches|merged"
msgstr ""
msgid "Branches|project settings"
msgstr ""
msgid "Branches|protected"
msgstr ""
msgid "Browse Directory"
msgstr ""
msgid "Browse File"
msgstr ""
msgid "Browse Files"
msgstr ""
msgid "Browse files"
msgstr ""
msgid "ByAuthor|by"
msgstr ""
msgid "CI / CD"
msgstr ""
msgid "CI configuration"
msgstr ""
msgid "CICD|Jobs"
msgstr ""
msgid "Cancel"
msgstr ""
msgid "Cancel edit"
msgstr ""
msgid "Change Weight"
msgstr ""
msgid "ChangeTypeActionLabel|Pick into branch"
msgstr ""
msgid "ChangeTypeActionLabel|Revert in branch"
msgstr ""
msgid "ChangeTypeAction|Cherry-pick"
msgstr ""
msgid "ChangeTypeAction|Revert"
msgstr ""
msgid "Changelog"
msgstr ""
msgid "Charts"
msgstr ""
msgid "Chat"
msgstr ""
msgid "Cherry-pick this commit"
msgstr ""
msgid "Cherry-pick this merge request"
msgstr ""
msgid "Choose which groups you wish to replicate to this secondary node. Leave blank to replicate all."
msgstr ""
msgid "CiStatusLabel|canceled"
msgstr ""
msgid "CiStatusLabel|created"
msgstr ""
msgid "CiStatusLabel|failed"
msgstr ""
msgid "CiStatusLabel|manual action"
msgstr ""
msgid "CiStatusLabel|passed"
msgstr ""
msgid "CiStatusLabel|passed with warnings"
msgstr ""
msgid "CiStatusLabel|pending"
msgstr ""
msgid "CiStatusLabel|skipped"
msgstr ""
msgid "CiStatusLabel|waiting for manual action"
msgstr ""
msgid "CiStatusText|blocked"
msgstr ""
msgid "CiStatusText|canceled"
msgstr ""
msgid "CiStatusText|created"
msgstr ""
msgid "CiStatusText|failed"
msgstr ""
msgid "CiStatusText|manual"
msgstr ""
msgid "CiStatusText|passed"
msgstr ""
msgid "CiStatusText|pending"
msgstr ""
msgid "CiStatusText|skipped"
msgstr ""
msgid "CiStatus|running"
msgstr ""
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr ""
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
msgid "Cluster"
msgstr ""
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
msgstr ""
msgid "ClusterIntegration|Cluster details"
msgstr ""
msgid "ClusterIntegration|Cluster integration"
msgstr ""
msgid "ClusterIntegration|Cluster integration is disabled for this project."
msgstr ""
msgid "ClusterIntegration|Cluster integration is enabled for this project."
msgstr ""
msgid "ClusterIntegration|Cluster integration is enabled for this project. Disabling this integration will not affect your cluster, it will only temporarily turn off GitLab's connection to it."
msgstr ""
msgid "ClusterIntegration|Cluster is being created on Google Container Engine..."
msgstr ""
msgid "ClusterIntegration|Cluster name"
msgstr ""
msgid "ClusterIntegration|Cluster was successfully created on Google Container Engine"
msgstr ""
msgid "ClusterIntegration|Copy cluster name"
msgstr ""
msgid "ClusterIntegration|Create cluster"
msgstr ""
msgid "ClusterIntegration|Create new cluster on Google Container Engine"
msgstr ""
msgid "ClusterIntegration|Enable cluster integration"
msgstr ""
msgid "ClusterIntegration|Google Cloud Platform project ID"
msgstr ""
msgid "ClusterIntegration|Google Container Engine"
msgstr ""
msgid "ClusterIntegration|Google Container Engine project"
msgstr ""
msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
msgstr ""
msgid "ClusterIntegration|Machine type"
msgstr ""
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
msgstr ""
msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
msgstr ""
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
msgstr ""
msgid "ClusterIntegration|Number of nodes"
msgstr ""
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr ""
msgid "ClusterIntegration|Project namespace (optional, unique)"
msgstr ""
msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
msgstr ""
msgid "ClusterIntegration|Remove cluster integration"
msgstr ""
msgid "ClusterIntegration|Remove integration"
msgstr ""
msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
msgstr ""
msgid "ClusterIntegration|See and edit the details for your cluster"
msgstr ""
msgid "ClusterIntegration|See machine types"
msgstr ""
msgid "ClusterIntegration|See your projects"
msgstr ""
msgid "ClusterIntegration|See zones"
msgstr ""
msgid "ClusterIntegration|Something went wrong on our end."
msgstr ""
msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
msgstr ""
msgid "ClusterIntegration|Toggle Cluster"
msgstr ""
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
msgstr ""
msgid "ClusterIntegration|Your account must have %{link_to_container_engine}"
msgstr ""
msgid "ClusterIntegration|Zone"
msgstr ""
msgid "ClusterIntegration|access to Google Container Engine"
msgstr ""
msgid "ClusterIntegration|cluster"
msgstr ""
msgid "ClusterIntegration|help page"
msgstr ""
msgid "ClusterIntegration|meets the requirements"
msgstr ""
msgid "ClusterIntegration|properly configured"
msgstr ""
msgid "Comments"
msgstr ""
msgid "Commit"
msgid_plural "Commits"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "Commit %d file"
msgid_plural "Commit %d files"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "Commit Message"
msgstr ""
msgid "Commit duration in minutes for last 30 commits"
msgstr ""
msgid "Commit message"
msgstr ""
msgid "CommitBoxTitle|Commit"
msgstr ""
msgid "CommitMessage|Add %{file_name}"
msgstr ""
msgid "Commits"
msgstr ""
msgid "Commits feed"
msgstr ""
msgid "Commits|History"
msgstr ""
msgid "Committed by"
msgstr ""
msgid "Compare"
msgstr ""
msgid "Container Registry"
msgstr ""
msgid "ContainerRegistry|Created"
msgstr ""
msgid "ContainerRegistry|First log in to GitLab&rsquo;s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:"
msgstr ""
msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:"
msgstr ""
msgid "ContainerRegistry|How to use the Container Registry"
msgstr ""
msgid "ContainerRegistry|Learn more about"
msgstr ""
msgid "ContainerRegistry|No tags in Container Registry for this container image."
msgstr ""
msgid "ContainerRegistry|Once you log in, you&rsquo;re free to create and upload a container image using the common %{build} and %{push} commands"
msgstr ""
msgid "ContainerRegistry|Remove repository"
msgstr ""
msgid "ContainerRegistry|Remove tag"
msgstr ""
msgid "ContainerRegistry|Size"
msgstr ""
msgid "ContainerRegistry|Tag"
msgstr ""
msgid "ContainerRegistry|Tag ID"
msgstr ""
msgid "ContainerRegistry|Use different image names"
msgstr ""
msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images."
msgstr ""
msgid "Contribution guide"
msgstr ""
msgid "Contributors"
msgstr ""
msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
msgstr ""
msgid "Control the maximum concurrency of repository backfill for this secondary node"
msgstr ""
msgid "Copy SSH public key to clipboard"
msgstr ""
msgid "Copy URL to clipboard"
msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr ""
msgid "Create New Directory"
msgstr ""
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr ""
msgid "Create directory"
msgstr ""
msgid "Create empty bare repository"
msgstr ""
msgid "Create file"
msgstr ""
msgid "Create merge request"
msgstr ""
msgid "Create new branch"
msgstr ""
msgid "Create new directory"
msgstr ""
msgid "Create new file"
msgstr ""
msgid "Create new..."
msgstr ""
msgid "CreateNewFork|Fork"
msgstr ""
msgid "CreateTag|Tag"
msgstr ""
msgid "CreateTokenToCloneLink|create a personal access token"
msgstr ""
msgid "Cron Timezone"
msgstr ""
msgid "Cron syntax"
msgstr ""
msgid "Custom notification events"
msgstr ""
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr ""
msgid "Cycle Analytics"
msgstr ""
msgid "Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr ""
msgid "CycleAnalyticsStage|Code"
msgstr ""
msgid "CycleAnalyticsStage|Issue"
msgstr ""
msgid "CycleAnalyticsStage|Plan"
msgstr ""
msgid "CycleAnalyticsStage|Production"
msgstr ""
msgid "CycleAnalyticsStage|Review"
msgstr ""
msgid "CycleAnalyticsStage|Staging"
msgstr ""
msgid "CycleAnalyticsStage|Test"
msgstr ""
msgid "DashboardProjects|All"
msgstr ""
msgid "DashboardProjects|Personal"
msgstr ""
msgid "Define a custom pattern with cron syntax"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "Deploy Keys"
msgstr ""
msgid "Description"
msgstr ""
msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr ""
msgid "Details"
msgstr ""
msgid "Directory name"
msgstr ""
msgid "Discard changes"
msgstr ""
msgid "Dismiss Cycle Analytics introduction box"
msgstr ""
msgid "Dismiss Merge Request promotion"
msgstr ""
msgid "Don't show again"
msgstr ""
msgid "Download"
msgstr ""
msgid "Download tar"
msgstr ""
msgid "Download tar.bz2"
msgstr ""
msgid "Download tar.gz"
msgstr ""
msgid "Download zip"
msgstr ""
msgid "DownloadArtifacts|Download"
msgstr ""
msgid "DownloadCommit|Email Patches"
msgstr ""
msgid "DownloadCommit|Plain Diff"
msgstr ""
msgid "DownloadSource|Download"
msgstr ""
msgid "Edit"
msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr ""
msgid "Emails"
msgstr ""
msgid "EventFilterBy|Filter by all"
msgstr ""
msgid "EventFilterBy|Filter by comments"
msgstr ""
msgid "EventFilterBy|Filter by issue events"
msgstr ""
msgid "EventFilterBy|Filter by merge events"
msgstr ""
msgid "EventFilterBy|Filter by push events"
msgstr ""
msgid "EventFilterBy|Filter by team"
msgstr ""
msgid "Every day (at 4:00am)"
msgstr ""
msgid "Every month (on the 1st at 4:00am)"
msgstr ""
msgid "Every week (Sundays at 4:00am)"
msgstr ""
msgid "Explore projects"
msgstr ""
msgid "Explore public groups"
msgstr ""
msgid "Failed to change the owner"
msgstr ""
msgid "Failed to remove the pipeline schedule"
msgstr ""
msgid "File name"
msgstr ""
msgid "Files"
msgstr ""
msgid "Filter by commit message"
msgstr ""
msgid "Find by path"
msgstr ""
msgid "Find file"
msgstr ""
msgid "FirstPushedBy|First"
msgstr ""
msgid "FirstPushedBy|pushed by"
msgstr ""
msgid "Fork"
msgid_plural "Forks"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "ForkedFromProjectPath|Forked from"
msgstr ""
msgid "ForkedFromProjectPath|Forked from %{project_name} (deleted)"
msgstr ""
msgid "Format"
msgstr ""
msgid "From issue creation until deploy to production"
msgstr ""
msgid "From merge request merge until deploy to production"
msgstr ""
msgid "GPG Keys"
msgstr ""
msgid "Geo Nodes"
msgstr ""
msgid "Geo|File sync capacity"
msgstr ""
msgid "Geo|Groups to replicate"
msgstr ""
msgid "Geo|Repository sync capacity"
msgstr ""
msgid "Geo|Select groups to replicate."
msgstr ""
msgid "Git storage health information has been reset"
msgstr ""
msgid "GitLab Runner section"
msgstr ""
msgid "Go to your fork"
msgstr ""
msgid "GoToYourFork|Fork"
msgstr ""
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
msgid "GroupSettings|Share with group lock"
msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr ""
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr ""
msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group"
msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr ""
msgid "GroupsEmptyState|No groups found"
msgstr ""
msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
msgstr ""
msgid "GroupsTreeRole|as"
msgstr ""
msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
msgstr ""
msgid "GroupsTree|Create a project in this group."
msgstr ""
msgid "GroupsTree|Create a subgroup in this group."
msgstr ""
msgid "GroupsTree|Edit group"
msgstr ""
msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
msgstr ""
msgid "GroupsTree|Filter by name..."
msgstr ""
msgid "GroupsTree|Leave this group"
msgstr ""
msgid "GroupsTree|Loading groups"
msgstr ""
msgid "GroupsTree|Sorry, no groups matched your search"
msgstr ""
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr ""
msgid "Health Check"
msgstr ""
msgid "Health information can be retrieved from the following endpoints. More information is available"
msgstr ""
msgid "HealthCheck|Access token is"
msgstr ""
msgid "HealthCheck|Healthy"
msgstr ""
msgid "HealthCheck|No Health Problems Detected"
msgstr ""
msgid "HealthCheck|Unhealthy"
msgstr ""
msgid "History"
msgstr ""
msgid "Housekeeping successfully started"
msgstr ""
msgid "Import repository"
msgstr ""
msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr ""
msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
msgstr ""
msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
msgstr ""
msgid "Install a Runner compatible with GitLab CI"
msgstr ""
msgid "Instance"
msgid_plural "Instances"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "Internal - The group and any internal projects can be viewed by any logged in user."
msgstr ""
msgid "Internal - The project can be accessed by any logged in user."
msgstr ""
msgid "Interval Pattern"
msgstr ""
msgid "Introducing Cycle Analytics"
msgstr ""
msgid "Issue board focus mode"
msgstr ""
msgid "Issue boards with milestones"
msgstr ""
msgid "Issue events"
msgstr ""
msgid "IssueBoards|Board"
msgstr ""
msgid "IssueBoards|Boards"
msgstr ""
msgid "Issues"
msgstr ""
msgid "LFSStatus|Disabled"
msgstr ""
msgid "LFSStatus|Enabled"
msgstr ""
msgid "Labels"
msgstr ""
msgid "Last %d day"
msgid_plural "Last %d days"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "Last Pipeline"
msgstr ""
msgid "Last commit"
msgstr ""
msgid "Last edited %{date}"
msgstr ""
msgid "Last edited by %{name}"
msgstr ""
msgid "Last update"
msgstr ""
msgid "Last updated"
msgstr ""
msgid "LastPushEvent|You pushed to"
msgstr ""
msgid "LastPushEvent|at"
msgstr ""
msgid "Learn more in the"
msgstr ""
msgid "Learn more in the|pipeline schedules documentation"
msgstr ""
msgid "Leave"
msgstr ""
msgid "Leave group"
msgstr ""
msgid "Leave project"
msgstr ""
msgid "License"
msgstr ""
msgid "Limited to showing %d event at most"
msgid_plural "Limited to showing %d events at most"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "Lock"
msgstr ""
msgid "Locked"
msgstr ""
msgid "Locked Files"
msgstr ""
msgid "Login"
msgstr ""
msgid "Maximum git storage failures"
msgstr ""
msgid "Median"
msgstr ""
msgid "Members"
msgstr ""
msgid "Merge Requests"
msgstr ""
msgid "Merge events"
msgstr ""
msgid "Merge request"
msgstr ""
msgid "Messages"
msgstr ""
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr ""
msgid "Monitoring"
msgstr ""
msgid "More information is available|here"
msgstr ""
msgid "Multiple issue boards"
msgstr ""
msgid "New Cluster"
msgstr ""
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "New Pipeline Schedule"
msgstr ""
msgid "New branch"
msgstr ""
msgid "New directory"
msgstr ""
msgid "New file"
msgstr ""
msgid "New group"
msgstr ""
msgid "New issue"
msgstr ""
msgid "New merge request"
msgstr ""
msgid "New project"
msgstr ""
msgid "New schedule"
msgstr ""
msgid "New snippet"
msgstr ""
msgid "New subgroup"
msgstr ""
msgid "New tag"
msgstr ""
msgid "No container images stored for this project. Add one by following the instructions above."
msgstr ""
msgid "No repository"
msgstr ""
msgid "No schedules"
msgstr ""
msgid "None"
msgstr ""
msgid "Not available"
msgstr ""
msgid "Not enough data"
msgstr ""
msgid "Notification events"
msgstr ""
msgid "NotificationEvent|Close issue"
msgstr ""
msgid "NotificationEvent|Close merge request"
msgstr ""
msgid "NotificationEvent|Failed pipeline"
msgstr ""
msgid "NotificationEvent|Merge merge request"
msgstr ""
msgid "NotificationEvent|New issue"
msgstr ""
msgid "NotificationEvent|New merge request"
msgstr ""
msgid "NotificationEvent|New note"
msgstr ""
msgid "NotificationEvent|Reassign issue"
msgstr ""
msgid "NotificationEvent|Reassign merge request"
msgstr ""
msgid "NotificationEvent|Reopen issue"
msgstr ""
msgid "NotificationEvent|Successful pipeline"
msgstr ""
msgid "NotificationLevel|Custom"
msgstr ""
msgid "NotificationLevel|Disabled"
msgstr ""
msgid "NotificationLevel|Global"
msgstr ""
msgid "NotificationLevel|On mention"
msgstr ""
msgid "NotificationLevel|Participate"
msgstr ""
msgid "NotificationLevel|Watch"
msgstr ""
msgid "Notifications"
msgstr ""
msgid "Number of access attempts"
msgstr ""
msgid "Number of failures before backing off"
msgstr ""
msgid "OfSearchInADropdown|Filter"
msgstr ""
msgid "Only project members can comment."
msgstr ""
msgid "OpenedNDaysAgo|Opened"
msgstr ""
msgid "Opens in a new window"
msgstr ""
msgid "Options"
msgstr ""
msgid "Overview"
msgstr ""
msgid "Owner"
msgstr ""
msgid "Pagination|Last »"
msgstr ""
msgid "Pagination|Next"
msgstr ""
msgid "Pagination|Prev"
msgstr ""
msgid "Pagination|« First"
msgstr ""
msgid "Password"
msgstr ""
msgid "People without permission will never get a notification and won\\'t be able to comment."
msgstr ""
msgid "Pipeline"
msgstr ""
msgid "Pipeline Health"
msgstr ""
msgid "Pipeline Schedule"
msgstr ""
msgid "Pipeline Schedules"
msgstr ""
msgid "Pipeline quota"
msgstr ""
msgid "PipelineCharts|Failed:"
msgstr ""
msgid "PipelineCharts|Overall statistics"
msgstr ""
msgid "PipelineCharts|Success ratio:"
msgstr ""
msgid "PipelineCharts|Successful:"
msgstr ""
msgid "PipelineCharts|Total:"
msgstr ""
msgid "PipelineSchedules|Activated"
msgstr ""
msgid "PipelineSchedules|Active"
msgstr ""
msgid "PipelineSchedules|All"
msgstr ""
msgid "PipelineSchedules|Inactive"
msgstr ""
msgid "PipelineSchedules|Input variable key"
msgstr ""
msgid "PipelineSchedules|Input variable value"
msgstr ""
msgid "PipelineSchedules|Next Run"
msgstr ""
msgid "PipelineSchedules|None"
msgstr ""
msgid "PipelineSchedules|Provide a short description for this pipeline"
msgstr ""
msgid "PipelineSchedules|Remove variable row"
msgstr ""
msgid "PipelineSchedules|Take ownership"
msgstr ""
msgid "PipelineSchedules|Target"
msgstr ""
msgid "PipelineSchedules|Variables"
msgstr ""
msgid "PipelineSheduleIntervalPattern|Custom"
msgstr ""
msgid "Pipelines"
msgstr ""
msgid "Pipelines charts"
msgstr ""
msgid "Pipelines for last month"
msgstr ""
msgid "Pipelines for last week"
msgstr ""
msgid "Pipelines for last year"
msgstr ""
msgid "Pipeline|all"
msgstr ""
msgid "Pipeline|success"
msgstr ""
msgid "Pipeline|with stage"
msgstr ""
msgid "Pipeline|with stages"
msgstr ""
msgid "Preferences"
msgstr ""
msgid "Private - Project access must be granted explicitly to each user."
msgstr ""
msgid "Private - The group and its projects can only be viewed by members."
msgstr ""
msgid "Profile"
msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
msgid "Profiles|Delete Account"
msgstr ""
msgid "Profiles|Delete account"
msgstr ""
msgid "Profiles|Delete your account?"
msgstr ""
msgid "Profiles|Deleting an account has the following effects:"
msgstr ""
msgid "Profiles|Invalid password"
msgstr ""
msgid "Profiles|Invalid username"
msgstr ""
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr ""
msgid "Profiles|You don't have access to delete this user."
msgstr ""
msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
msgstr ""
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr ""
msgid "Profiles|your account"
msgstr ""
msgid "Project '%{project_name}' is in the process of being deleted."
msgstr ""
msgid "Project '%{project_name}' queued for deletion."
msgstr ""
msgid "Project '%{project_name}' was successfully created."
msgstr ""
msgid "Project '%{project_name}' was successfully updated."
msgstr ""
msgid "Project access must be granted explicitly to each user."
msgstr ""
msgid "Project details"
msgstr ""
msgid "Project export could not be deleted."
msgstr ""
msgid "Project export has been deleted."
msgstr ""
msgid "Project export link has expired. Please generate a new export from your project settings."
msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
msgid "ProjectActivityRSS|Subscribe"
msgstr ""
msgid "ProjectFeature|Disabled"
msgstr ""
msgid "ProjectFeature|Everyone with access"
msgstr ""
msgid "ProjectFeature|Only team members"
msgstr ""
msgid "ProjectFileTree|Name"
msgstr ""
msgid "ProjectLastActivity|Never"
msgstr ""
msgid "ProjectLifecycle|Stage"
msgstr ""
msgid "ProjectNetworkGraph|Graph"
msgstr ""
msgid "ProjectSettings|Contact an admin to change this setting."
msgstr ""
msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr ""
msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
msgstr ""
msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
msgstr ""
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr ""
msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr ""
msgid "Projects"
msgstr ""
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
msgid "ProjectsDropdown|Loading projects"
msgstr ""
msgid "ProjectsDropdown|Projects you visit often will appear here"
msgstr ""
msgid "ProjectsDropdown|Search your projects"
msgstr ""
msgid "ProjectsDropdown|Something went wrong on our end."
msgstr ""
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr ""
msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr ""
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr ""
msgid "Public - The project can be accessed without any authentication."
msgstr ""
msgid "Push Rules"
msgstr ""
msgid "Push events"
msgstr ""
msgid "PushRule|Committer restriction"
msgstr ""
msgid "Read more"
msgstr ""
msgid "Readme"
msgstr ""
msgid "RefSwitcher|Branches"
msgstr ""
msgid "RefSwitcher|Tags"
msgstr ""
msgid "Registry"
msgstr ""
msgid "Related Commits"
msgstr ""
msgid "Related Deployed Jobs"
msgstr ""
msgid "Related Issues"
msgstr ""
msgid "Related Jobs"
msgstr ""
msgid "Related Merge Requests"
msgstr ""
msgid "Related Merged Requests"
msgstr ""
msgid "Remind later"
msgstr ""
msgid "Remove project"
msgstr ""
msgid "Repository"
msgstr ""
msgid "Request Access"
msgstr ""
msgid "Reset git storage health information"
msgstr ""
msgid "Reset health check access token"
msgstr ""
msgid "Reset runners registration token"
msgstr ""
msgid "Revert this commit"
msgstr ""
msgid "Revert this merge request"
msgstr ""
msgid "SSH Keys"
msgstr ""
msgid "Save"
msgstr ""
msgid "Save changes"
msgstr ""
msgid "Save pipeline schedule"
msgstr ""
msgid "Schedule a new pipeline"
msgstr ""
msgid "Schedules"
msgstr ""
msgid "Scheduling Pipelines"
msgstr ""
msgid "Search branches and tags"
msgstr ""
msgid "Seconds before reseting failure information"
msgstr ""
msgid "Seconds to wait after a storage failure"
msgstr ""
msgid "Seconds to wait for a storage access attempt"
msgstr ""
msgid "Select Archive Format"
msgstr ""
msgid "Select a timezone"
msgstr ""
msgid "Select target branch"
msgstr ""
msgid "Service Templates"
msgstr ""
msgid "Set a password on your account to pull or push via %{protocol}."
msgstr ""
msgid "Set up CI"
msgstr ""
msgid "Set up Koding"
msgstr ""
msgid "Set up auto deploy"
msgstr ""
msgid "SetPasswordToCloneLink|set a password"
msgstr ""
msgid "Settings"
msgstr ""
msgid "Show parent pages"
msgstr ""
msgid "Show parent subgroups"
msgstr ""
msgid "Showing %d event"
msgid_plural "Showing %d events"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "Snippets"
msgstr ""
msgid "Something went wrong on our end."
msgstr ""
msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
msgstr ""
msgid "Something went wrong while fetching the projects."
msgstr ""
msgid "Something went wrong while fetching the registry list."
msgstr ""
msgid "Sort by"
msgstr ""
msgid "SortOptions|Access level, ascending"
msgstr ""
msgid "SortOptions|Access level, descending"
msgstr ""
msgid "SortOptions|Created date"
msgstr ""
msgid "SortOptions|Due date"
msgstr ""
msgid "SortOptions|Due later"
msgstr ""
msgid "SortOptions|Due soon"
msgstr ""
msgid "SortOptions|Label priority"
msgstr ""
msgid "SortOptions|Largest group"
msgstr ""
msgid "SortOptions|Largest repository"
msgstr ""
msgid "SortOptions|Last created"
msgstr ""
msgid "SortOptions|Last joined"
msgstr ""
msgid "SortOptions|Last updated"
msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
msgid "SortOptions|Less weight"
msgstr ""
msgid "SortOptions|Milestone"
msgstr ""
msgid "SortOptions|Milestone due later"
msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
msgid "SortOptions|More weight"
msgstr ""
msgid "SortOptions|Most popular"
msgstr ""
msgid "SortOptions|Name"
msgstr ""
msgid "SortOptions|Name, ascending"
msgstr ""
msgid "SortOptions|Name, descending"
msgstr ""
msgid "SortOptions|Oldest created"
msgstr ""
msgid "SortOptions|Oldest joined"
msgstr ""
msgid "SortOptions|Oldest sign in"
msgstr ""
msgid "SortOptions|Oldest updated"
msgstr ""
msgid "SortOptions|Popularity"
msgstr ""
msgid "SortOptions|Priority"
msgstr ""
msgid "SortOptions|Recent sign in"
msgstr ""
msgid "SortOptions|Start later"
msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
msgid "SortOptions|Weight"
msgstr ""
msgid "Source code"
msgstr ""
msgid "Spam Logs"
msgstr ""
msgid "Specify the following URL during the Runner setup:"
msgstr ""
msgid "StarProject|Star"
msgstr ""
msgid "Starred projects"
msgstr ""
msgid "Start a %{new_merge_request} with these changes"
msgstr ""
msgid "Start the Runner!"
msgstr ""
msgid "Subgroups"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "Switch branch/tag"
msgstr ""
msgid "System Hooks"
msgstr ""
msgid "Tag"
msgid_plural "Tags"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "Tags"
msgstr ""
msgid "Target Branch"
msgstr ""
msgid "Team"
msgstr ""
msgid "Thanks! Don't show me this again"
msgstr ""
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr ""
msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
msgstr ""
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr ""
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
msgid "The fork relationship has been removed."
msgstr ""
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
msgstr ""
msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
msgstr ""
msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
msgstr ""
msgid "The phase of the development lifecycle."
msgstr ""
msgid "The pipelines schedule runs pipelines in the future, repeatedly, for specific branches or tags. Those scheduled pipelines will inherit limited project access based on their associated user."
msgstr ""
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr ""
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr ""
msgid "The project can be accessed by any logged in user."
msgstr ""
msgid "The project can be accessed without any authentication."
msgstr ""
msgid "The repository for this project does not exist."
msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr ""
msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
msgstr ""
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
msgstr ""
msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr ""
msgid "There are problems accessing Git storage: "
msgstr ""
msgid "This branch has changed since you started editing. Would you like to create a new branch?"
msgstr ""
msgid "This is a confidential issue."
msgstr ""
msgid "This is the author's first Merge Request to this project."
msgstr ""
msgid "This issue is confidential and locked."
msgstr ""
msgid "This issue is locked."
msgstr ""
msgid "This means you can not push code until you create an empty repository or import existing one."
msgstr ""
msgid "This merge request is locked."
msgstr ""
msgid "Time before an issue gets scheduled"
msgstr ""
msgid "Time before an issue starts implementation"
msgstr ""
msgid "Time between merge request creation and merge/close"
msgstr ""
msgid "Time until first merge request"
msgstr ""
msgid "Timeago|%s days ago"
msgstr ""
msgid "Timeago|%s days remaining"
msgstr ""
msgid "Timeago|%s hours remaining"
msgstr ""
msgid "Timeago|%s minutes ago"
msgstr ""
msgid "Timeago|%s minutes remaining"
msgstr ""
msgid "Timeago|%s months ago"
msgstr ""
msgid "Timeago|%s months remaining"
msgstr ""
msgid "Timeago|%s seconds remaining"
msgstr ""
msgid "Timeago|%s weeks ago"
msgstr ""
msgid "Timeago|%s weeks remaining"
msgstr ""
msgid "Timeago|%s years ago"
msgstr ""
msgid "Timeago|%s years remaining"
msgstr ""
msgid "Timeago|1 day remaining"
msgstr ""
msgid "Timeago|1 hour remaining"
msgstr ""
msgid "Timeago|1 minute remaining"
msgstr ""
msgid "Timeago|1 month remaining"
msgstr ""
msgid "Timeago|1 week remaining"
msgstr ""
msgid "Timeago|1 year remaining"
msgstr ""
msgid "Timeago|Past due"
msgstr ""
msgid "Timeago|a day ago"
msgstr ""
msgid "Timeago|a month ago"
msgstr ""
msgid "Timeago|a week ago"
msgstr ""
msgid "Timeago|a year ago"
msgstr ""
msgid "Timeago|about %s hours ago"
msgstr ""
msgid "Timeago|about a minute ago"
msgstr ""
msgid "Timeago|about an hour ago"
msgstr ""
msgid "Timeago|in %s days"
msgstr ""
msgid "Timeago|in %s hours"
msgstr ""
msgid "Timeago|in %s minutes"
msgstr ""
msgid "Timeago|in %s months"
msgstr ""
msgid "Timeago|in %s seconds"
msgstr ""
msgid "Timeago|in %s weeks"
msgstr ""
msgid "Timeago|in %s years"
msgstr ""
msgid "Timeago|in 1 day"
msgstr ""
msgid "Timeago|in 1 hour"
msgstr ""
msgid "Timeago|in 1 minute"
msgstr ""
msgid "Timeago|in 1 month"
msgstr ""
msgid "Timeago|in 1 week"
msgstr ""
msgid "Timeago|in 1 year"
msgstr ""
msgid "Timeago|in a while"
msgstr ""
msgid "Timeago|less than a minute ago"
msgstr ""
msgid "Time|hr"
msgid_plural "Time|hrs"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "Time|min"
msgid_plural "Time|mins"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "Time|s"
msgstr ""
msgid "Total Time"
msgstr ""
msgid "Total test time for all commits/merges"
msgstr ""
msgid "Track activity with Contribution Analytics."
msgstr ""
msgid "Unlock"
msgstr ""
msgid "Unlocked"
msgstr ""
msgid "Unstar"
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Upgrade your plan to activate Advanced Global Search."
msgstr ""
msgid "Upgrade your plan to activate Contribution Analytics."
msgstr ""
msgid "Upgrade your plan to activate Group Webhooks."
msgstr ""
msgid "Upgrade your plan to activate Issue weight."
msgstr ""
msgid "Upgrade your plan to improve Issue boards."
msgstr ""
msgid "Upload New File"
msgstr ""
msgid "Upload file"
msgstr ""
msgid "UploadLink|click to upload"
msgstr ""
msgid "Use the following registration token during setup:"
msgstr ""
msgid "Use your global notification setting"
msgstr ""
msgid "View file @ "
msgstr ""
msgid "View open merge request"
msgstr ""
msgid "View replaced file @ "
msgstr ""
msgid "VisibilityLevel|Internal"
msgstr ""
msgid "VisibilityLevel|Private"
msgstr ""
msgid "VisibilityLevel|Public"
msgstr ""
msgid "VisibilityLevel|Unknown"
msgstr ""
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
msgid "We don't have enough data to show this stage."
msgstr ""
msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
msgstr ""
msgid "Weight"
msgstr ""
msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
msgstr ""
msgid "Wiki"
msgstr ""
msgid "WikiClone|Clone your wiki"
msgstr ""
msgid "WikiClone|Git Access"
msgstr ""
msgid "WikiClone|Install Gollum"
msgstr ""
msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:"
msgstr ""
msgid "WikiClone|Start Gollum and edit locally"
msgstr ""
msgid "WikiEmptyPageError|You are not allowed to create wiki pages"
msgstr ""
msgid "WikiHistoricalPage|This is an old version of this page."
msgstr ""
msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}."
msgstr ""
msgid "WikiHistoricalPage|history"
msgstr ""
msgid "WikiHistoricalPage|most recent version"
msgstr ""
msgid "WikiMarkdownDocs|More examples are in the %{docs_link}"
msgstr ""
msgid "WikiMarkdownDocs|documentation"
msgstr ""
msgid "WikiMarkdownTip|To link to a (new) page, simply type %{link_example}"
msgstr ""
msgid "WikiNewPagePlaceholder|how-to-setup"
msgstr ""
msgid "WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories."
msgstr ""
msgid "WikiNewPageTitle|New Wiki Page"
msgstr ""
msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?"
msgstr ""
msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
msgstr ""
msgid "WikiPageConflictMessage|the page"
msgstr ""
msgid "WikiPageCreate|Create %{page_title}"
msgstr ""
msgid "WikiPageEdit|Update %{page_title}"
msgstr ""
msgid "WikiPage|Page slug"
msgstr ""
msgid "WikiPage|Write your content or drag files here..."
msgstr ""
msgid "Wiki|Create Page"
msgstr ""
msgid "Wiki|Create page"
msgstr ""
msgid "Wiki|Edit Page"
msgstr ""
msgid "Wiki|Empty page"
msgstr ""
msgid "Wiki|More Pages"
msgstr ""
msgid "Wiki|New page"
msgstr ""
msgid "Wiki|Page history"
msgstr ""
msgid "Wiki|Page version"
msgstr ""
msgid "Wiki|Pages"
msgstr ""
msgid "Wiki|Wiki Pages"
msgstr ""
msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
msgstr ""
msgid "Withdraw Access Request"
msgstr ""
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr ""
msgid "You are going to remove %{project_name_with_namespace}. Removed project CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr ""
msgid "You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?"
msgstr ""
msgid "You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?"
msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
msgstr ""
msgid "You can only add files when you are on a branch"
msgstr ""
msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
msgstr ""
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You have reached your project limit"
msgstr ""
msgid "You must sign in to star a project"
msgstr ""
msgid "You need permission."
msgstr ""
msgid "You will not get any notifications via email"
msgstr ""
msgid "You will only receive notifications for the events you choose"
msgstr ""
msgid "You will only receive notifications for threads you have participated in"
msgstr ""
msgid "You will receive notifications for any activity"
msgstr ""
msgid "You will receive notifications only for comments in which you were @mentioned"
msgstr ""
msgid "You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account"
msgstr ""
msgid "You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile"
msgstr ""
msgid "Your comment will not be visible to the public."
msgstr ""
msgid "Your groups"
msgstr ""
msgid "Your name"
msgstr ""
msgid "Your projects"
msgstr ""
msgid "commit"
msgstr ""
msgid "day"
msgid_plural "days"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "new merge request"
msgstr ""
msgid "notification emails"
msgstr ""
msgid "parent"
msgid_plural "parents"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "password"
msgstr ""
msgid "personal access token"
msgstr ""
msgid "to help your contributors communicate effectively!"
msgstr ""
msgid "username"
msgstr ""
...@@ -3,7 +3,7 @@ msgstr "" ...@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: gitlab-ee\n" "Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-02 14:42+0100\n" "POT-Creation-Date: 2017-11-02 14:42+0100\n"
"PO-Revision-Date: 2017-11-04 13:27-0400\n" "PO-Revision-Date: 2017-11-18 12:51-0500\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Portuguese, Brazilian\n" "Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n" "Language: pt_BR\n"
...@@ -361,10 +361,10 @@ msgid "Browse Directory" ...@@ -361,10 +361,10 @@ msgid "Browse Directory"
msgstr "Navegar no Diretório" msgstr "Navegar no Diretório"
msgid "Browse File" msgid "Browse File"
msgstr "Pesquisar Arquivo" msgstr "Acessar arquivo"
msgid "Browse Files" msgid "Browse Files"
msgstr "Pesquisar Arquivos" msgstr "Acessar arquivos"
msgid "Browse files" msgid "Browse files"
msgstr "Navegar pelos arquivos" msgstr "Navegar pelos arquivos"
...@@ -1367,7 +1367,7 @@ msgid "Number of access attempts" ...@@ -1367,7 +1367,7 @@ msgid "Number of access attempts"
msgstr "Número de tentativas de acesso" msgstr "Número de tentativas de acesso"
msgid "Number of failures before backing off" msgid "Number of failures before backing off"
msgstr "" msgstr "Número de falhas antes de reverter"
msgid "OfSearchInADropdown|Filter" msgid "OfSearchInADropdown|Filter"
msgstr "Filtrar" msgstr "Filtrar"
...@@ -1968,7 +1968,7 @@ msgid "The Advanced Global Search in GitLab is a powerful search service that sa ...@@ -1968,7 +1968,7 @@ msgid "The Advanced Global Search in GitLab is a powerful search service that sa
msgstr "A pesquisa global avançado no GitLab é um serviço poderoso de pesquisa que poupa seu tempo. Ao invés de criar código duplicado e perder seu tempo, você pode agora pesquisar por código de outros times que podem ajudar no seu próprio projeto." msgstr "A pesquisa global avançado no GitLab é um serviço poderoso de pesquisa que poupa seu tempo. Ao invés de criar código duplicado e perder seu tempo, você pode agora pesquisar por código de outros times que podem ajudar no seu próprio projeto."
msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
msgstr "" msgstr "O limite do recuso do circuitbreaker deve ser inferior ao limite de contagem de falhas"
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "A etapa de codificação mostra o tempo desde a entrega do primeiro commit até a criação do merge request. Os dados serão automaticamente adicionados aqui desde o momento de criação do merge request." msgstr "A etapa de codificação mostra o tempo desde a entrega do primeiro commit até a criação do merge request. Os dados serão automaticamente adicionados aqui desde o momento de criação do merge request."
......
...@@ -3,7 +3,7 @@ msgstr "" ...@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: gitlab-ee\n" "Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-02 14:42+0100\n" "POT-Creation-Date: 2017-11-02 14:42+0100\n"
"PO-Revision-Date: 2017-11-05 14:39-0500\n" "PO-Revision-Date: 2017-11-17 07:55-0500\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"Language: ru_RU\n" "Language: ru_RU\n"
...@@ -188,7 +188,7 @@ msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly ...@@ -188,7 +188,7 @@ msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly
msgstr "Приложения для автоматического ревью и автоматического развёртывания требуют указания %{kubernetes} для корректной работы." msgstr "Приложения для автоматического ревью и автоматического развёртывания требуют указания %{kubernetes} для корректной работы."
msgid "AutoDevOps|Auto DevOps (Beta)" msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr "" msgstr "Auto DevOps (бета)"
msgid "AutoDevOps|Auto DevOps documentation" msgid "AutoDevOps|Auto DevOps documentation"
msgstr "" msgstr ""
......
...@@ -3,7 +3,7 @@ msgstr "" ...@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: gitlab-ee\n" "Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-02 14:42+0100\n" "POT-Creation-Date: 2017-11-02 14:42+0100\n"
"PO-Revision-Date: 2017-11-05 08:38-0500\n" "PO-Revision-Date: 2017-11-21 16:43-0500\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Ukrainian\n" "Language-Team: Ukrainian\n"
"Language: uk_UA\n" "Language: uk_UA\n"
...@@ -18,9 +18,9 @@ msgstr "" ...@@ -18,9 +18,9 @@ msgstr ""
msgid "%d commit" msgid "%d commit"
msgid_plural "%d commits" msgid_plural "%d commits"
msgstr[0] "%d комміт" msgstr[0] "%d коміт"
msgstr[1] "%d комміта" msgstr[1] "%d коміта"
msgstr[2] "%d коммітів" msgstr[2] "%d комітів"
msgid "%d layer" msgid "%d layer"
msgid_plural "%d layers" msgid_plural "%d layers"
...@@ -30,21 +30,21 @@ msgstr[2] "%d шарів" ...@@ -30,21 +30,21 @@ msgstr[2] "%d шарів"
msgid "%s additional commit has been omitted to prevent performance issues." msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "%s доданий Комміт був виключений для запобігання проблем з продуктивністю." msgstr[0] "%s доданий коміт був виключений для запобігання проблем із швидкодією."
msgstr[1] "%s доданих коммітів були виключені для запобігання проблем з продуктивністю." msgstr[1] "%s доданих коміта були виключені для запобігання проблем із швидкодією."
msgstr[2] "%s доданих коммітів були виключені для запобігання проблем з продуктивністю." msgstr[2] "%s доданих комітів були виключені для запобігання проблем із швидкодією."
msgid "%{commit_author_link} committed %{commit_timeago}" msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "%{commit_author_link} комміт %{commit_timeago}" msgstr "%{commit_author_link} закомітив %{commit_timeago}"
msgid "%{count} participant" msgid "%{count} participant"
msgid_plural "%{count} participants" msgid_plural "%{count} participants"
msgstr[0] "" msgstr[0] "%{count} участник"
msgstr[1] "" msgstr[1] "%{count} участника"
msgstr[2] "" msgstr[2] "%{count} участників"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "на %{number_commits_behind} коммітів позаду %{default_branch}, на %{number_commits_ahead} коммітів попереду" msgstr "на %{number_commits_behind} комітів позаду %{default_branch}, на %{number_commits_ahead} комітів попереду"
msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt."
msgstr "%{number_of_failures} від %{maximum_failures} невдач. GitLab надасть доступ на наступну спробу." msgstr "%{number_of_failures} від %{maximum_failures} невдач. GitLab надасть доступ на наступну спробу."
...@@ -68,7 +68,7 @@ msgid "+ %{moreCount} more" ...@@ -68,7 +68,7 @@ msgid "+ %{moreCount} more"
msgstr "+ ще %{moreCount}" msgstr "+ ще %{moreCount}"
msgid "- show less" msgid "- show less"
msgstr "" msgstr "- показати менше"
msgid "1 pipeline" msgid "1 pipeline"
msgid_plural "%d pipelines" msgid_plural "%d pipelines"
...@@ -122,7 +122,7 @@ msgid "Add License" ...@@ -122,7 +122,7 @@ msgid "Add License"
msgstr "Додати ліцензію" msgstr "Додати ліцензію"
msgid "Add an SSH key to your profile to pull or push via SSH." msgid "Add an SSH key to your profile to pull or push via SSH."
msgstr "Додати SSH ключа в свій профіль, щоб мати можливість завантажити чи надіслати зміни через SSH." msgstr "Додайте SSH ключ в свій профіль, щоб мати можливість завантажити чи надіслати зміни через SSH."
msgid "Add new directory" msgid "Add new directory"
msgstr "Додати новий каталог" msgstr "Додати новий каталог"
...@@ -266,7 +266,7 @@ msgstr[1] "Гілки" ...@@ -266,7 +266,7 @@ msgstr[1] "Гілки"
msgstr[2] "Гілок" msgstr[2] "Гілок"
msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr "Гілка <strong>%{branch_name}</strong> створена. Для настройки автоматичного розгортання виберіть GitLab CI Yaml-шаблон і закоммітьте зміни. %{link_to_autodeploy_doc}" msgstr "Гілка <strong>%{branch_name}</strong> створена. Для настройки автоматичного розгортання виберіть GitLab CI Yaml-шаблон і закомітьте зміни. %{link_to_autodeploy_doc}"
msgid "Branch has changed" msgid "Branch has changed"
msgstr "Гілка змінилась" msgstr "Гілка змінилась"
...@@ -281,7 +281,7 @@ msgid "Branches" ...@@ -281,7 +281,7 @@ msgid "Branches"
msgstr "Гілки" msgstr "Гілки"
msgid "Branches|Cant find HEAD commit for this branch" msgid "Branches|Cant find HEAD commit for this branch"
msgstr "Не можу знайти HEAD-комміт для цієї гілки" msgstr "Не можу знайти HEAD-коміт для цієї гілки"
msgid "Branches|Compare" msgid "Branches|Compare"
msgstr "Порівняти" msgstr "Порівняти"
...@@ -326,7 +326,7 @@ msgid "Branches|Only a project master or owner can delete a protected branch" ...@@ -326,7 +326,7 @@ msgid "Branches|Only a project master or owner can delete a protected branch"
msgstr "Тільки керівник або власник проекту може видалити захищену гілку" msgstr "Тільки керівник або власник проекту може видалити захищену гілку"
msgid "Branches|Protected branches can be managed in %{project_settings_link}" msgid "Branches|Protected branches can be managed in %{project_settings_link}"
msgstr "Управляти захищеними гілками можливо в %{project_settings_link}" msgstr "Керувати захищеними гілками можливо в %{project_settings_link}"
msgid "Branches|Sort by" msgid "Branches|Sort by"
msgstr "Сортувати за" msgstr "Сортувати за"
...@@ -359,7 +359,7 @@ msgid "Branches|merged" ...@@ -359,7 +359,7 @@ msgid "Branches|merged"
msgstr "злита" msgstr "злита"
msgid "Branches|project settings" msgid "Branches|project settings"
msgstr "Настройки проекту" msgstr "Налаштуваннях проекту"
msgid "Branches|protected" msgid "Branches|protected"
msgstr "захищені" msgstr "захищені"
...@@ -419,7 +419,7 @@ msgid "Chat" ...@@ -419,7 +419,7 @@ msgid "Chat"
msgstr "Чат" msgstr "Чат"
msgid "Cherry-pick this commit" msgid "Cherry-pick this commit"
msgstr "Cherry-pick в цьому комміті" msgstr "Cherry-pick в цьому коміті"
msgid "Cherry-pick this merge request" msgid "Cherry-pick this merge request"
msgstr "Cherry-pick в цьому запиті на злиття" msgstr "Cherry-pick в цьому запиті на злиття"
...@@ -627,42 +627,42 @@ msgstr "Коментарі" ...@@ -627,42 +627,42 @@ msgstr "Коментарі"
msgid "Commit" msgid "Commit"
msgid_plural "Commits" msgid_plural "Commits"
msgstr[0] "Комміт" msgstr[0] "Коміт"
msgstr[1] "Комміта" msgstr[1] "Коміта"
msgstr[2] "Коммітів" msgstr[2] "Комітів"
msgid "Commit %d file" msgid "Commit %d file"
msgid_plural "Commit %d files" msgid_plural "Commit %d files"
msgstr[0] "" msgstr[0] "Закомітити %d файл"
msgstr[1] "" msgstr[1] "Закомітити %d файли"
msgstr[2] "" msgstr[2] "Закомітити %d файлів"
msgid "Commit Message" msgid "Commit Message"
msgstr "Повідомлення для комміту" msgstr "Коміт-повідомелння"
msgid "Commit duration in minutes for last 30 commits" msgid "Commit duration in minutes for last 30 commits"
msgstr "Тривалість останніх 30 коммітів у хвилинах" msgstr "Тривалість останніх 30 комітів у хвилинах"
msgid "Commit message" msgid "Commit message"
msgstr "Комміт повідомлення" msgstr "Коміт-повідомлення"
msgid "CommitBoxTitle|Commit" msgid "CommitBoxTitle|Commit"
msgstr "Комміт" msgstr "Коміт"
msgid "CommitMessage|Add %{file_name}" msgid "CommitMessage|Add %{file_name}"
msgstr "Додати %{file_name}" msgstr "Додавання %{file_name}"
msgid "Commits" msgid "Commits"
msgstr "Комміти" msgstr "Коміти"
msgid "Commits feed" msgid "Commits feed"
msgstr "Канал коммітів" msgstr "Канал комітів"
msgid "Commits|History" msgid "Commits|History"
msgstr "Історія" msgstr "Історія"
msgid "Committed by" msgid "Committed by"
msgstr "Комміт від" msgstr "Коміт від"
msgid "Compare" msgid "Compare"
msgstr "Порівняти" msgstr "Порівняти"
...@@ -938,7 +938,7 @@ msgid "Files" ...@@ -938,7 +938,7 @@ msgid "Files"
msgstr "Файли" msgstr "Файли"
msgid "Filter by commit message" msgid "Filter by commit message"
msgstr "Фільтрувати повідомлення коммітів" msgstr "Фільтрувати за коміт-повідомленням"
msgid "Find by path" msgid "Find by path"
msgstr "Пошук по шляху" msgstr "Пошук по шляху"
...@@ -1169,7 +1169,7 @@ msgid "Last Pipeline" ...@@ -1169,7 +1169,7 @@ msgid "Last Pipeline"
msgstr "Останній Конвеєр" msgstr "Останній Конвеєр"
msgid "Last commit" msgid "Last commit"
msgstr "Останній комміт" msgstr "Останній коміт"
msgid "Last edited %{date}" msgid "Last edited %{date}"
msgstr "Останні зміни %{date}" msgstr "Останні зміни %{date}"
...@@ -1379,10 +1379,10 @@ msgid "Notifications" ...@@ -1379,10 +1379,10 @@ msgid "Notifications"
msgstr "Сповіщення" msgstr "Сповіщення"
msgid "Number of access attempts" msgid "Number of access attempts"
msgstr "" msgstr "Кількість спроб доступу"
msgid "Number of failures before backing off" msgid "Number of failures before backing off"
msgstr "" msgstr "Кількість помилок до призупинення"
msgid "OfSearchInADropdown|Filter" msgid "OfSearchInADropdown|Filter"
msgstr "Фільтр" msgstr "Фільтр"
...@@ -1628,7 +1628,7 @@ msgid "ProjectSettings|Contact an admin to change this setting." ...@@ -1628,7 +1628,7 @@ msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "Зверніться до адміністратора, щоб змінити це налаштування." msgstr "Зверніться до адміністратора, щоб змінити це налаштування."
msgid "ProjectSettings|Only signed commits can be pushed to this repository." msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "Тільки підписані комміти можуть бути надіслані в цей репозиторій." msgstr "Тільки підписані коміти можуть бути надіслані в цей репозиторій."
msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin." msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
msgstr "Цей параметр застосовується на рівні сервера та може бути перевизначений адміністратором." msgstr "Цей параметр застосовується на рівні сервера та може бути перевизначений адміністратором."
...@@ -1640,7 +1640,7 @@ msgid "ProjectSettings|This setting will be applied to all projects unless overr ...@@ -1640,7 +1640,7 @@ msgid "ProjectSettings|This setting will be applied to all projects unless overr
msgstr "Цей параметр буде застосовано до всіх проектів, якщо адміністратор не змінить його." msgstr "Цей параметр буде застосовано до всіх проектів, якщо адміністратор не змінить його."
msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr "" msgstr "Користувачі можуть виконувати push в цей репозиторій лише тих комітів, які містять одну із підтверджених адрес електронної пошти."
msgid "Projects" msgid "Projects"
msgstr "Проекти" msgstr "Проекти"
...@@ -1679,7 +1679,7 @@ msgid "Push events" ...@@ -1679,7 +1679,7 @@ msgid "Push events"
msgstr "Push-події" msgstr "Push-події"
msgid "PushRule|Committer restriction" msgid "PushRule|Committer restriction"
msgstr "" msgstr "Обмеження для коміттера"
msgid "Read more" msgid "Read more"
msgstr "Докладніше" msgstr "Докладніше"
...@@ -1697,7 +1697,7 @@ msgid "Registry" ...@@ -1697,7 +1697,7 @@ msgid "Registry"
msgstr "Реєстр" msgstr "Реєстр"
msgid "Related Commits" msgid "Related Commits"
msgstr "Пов'язані Комміти" msgstr "Пов'язані Коміти"
msgid "Related Deployed Jobs" msgid "Related Deployed Jobs"
msgstr "Пов’язані розгорнуті задачі (Jobs)" msgstr "Пов’язані розгорнуті задачі (Jobs)"
...@@ -1730,13 +1730,13 @@ msgid "Reset git storage health information" ...@@ -1730,13 +1730,13 @@ msgid "Reset git storage health information"
msgstr "Скиньте інформацію про працездатність сховища git" msgstr "Скиньте інформацію про працездатність сховища git"
msgid "Reset health check access token" msgid "Reset health check access token"
msgstr "Скиньте токен доступу для перевірки перевірки працездатності" msgstr "Оновити токен доступу для перевірки працездатності"
msgid "Reset runners registration token" msgid "Reset runners registration token"
msgstr "Скинути реєстраційний токен runner-ів" msgstr "Скинути реєстраційний токен runner-ів"
msgid "Revert this commit" msgid "Revert this commit"
msgstr "Скасувати цей комміт" msgstr "Скасувати цей коміт"
msgid "Revert this merge request" msgid "Revert this merge request"
msgstr "Скасувати цей запит на злиття" msgstr "Скасувати цей запит на злиття"
...@@ -1946,7 +1946,7 @@ msgid "Starred projects" ...@@ -1946,7 +1946,7 @@ msgid "Starred projects"
msgstr "Відмічені проекти" msgstr "Відмічені проекти"
msgid "Start a %{new_merge_request} with these changes" msgid "Start a %{new_merge_request} with these changes"
msgstr "Почати %{new_merge_request} з цих змін" msgstr "Почати %{new_merge_request} з цими змінами"
msgid "Start the Runner!" msgid "Start the Runner!"
msgstr "Запустіть Runner!" msgstr "Запустіть Runner!"
...@@ -1985,10 +1985,10 @@ msgid "The Advanced Global Search in GitLab is a powerful search service that sa ...@@ -1985,10 +1985,10 @@ msgid "The Advanced Global Search in GitLab is a powerful search service that sa
msgstr "Розширений глобальний пошук в GitLab - це потужний інструмент який заощаджує ваш час. Замість дублювання коду і витрати часу, ви можете шукати код всередині інших команд, який може допомогти у вашому проекті." msgstr "Розширений глобальний пошук в GitLab - це потужний інструмент який заощаджує ваш час. Замість дублювання коду і витрати часу, ви можете шукати код всередині інших команд, який може допомогти у вашому проекті."
msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
msgstr "" msgstr "Поріг призупинення circuitbreaker має бути нижчий за поріг повного відключення"
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "На стадії написання коду, показує час першого комміту до створення запиту на об'єднання. Дані будуть автоматично додані після створення вашого першого запиту на об'єднання." msgstr "На стадії написання коду, показує час першого коміту до створення запиту на об'єднання. Дані будуть автоматично додані після створення вашого першого запиту на об'єднання."
msgid "The collection of events added to the data gathered for that stage." msgid "The collection of events added to the data gathered for that stage."
msgstr "Колекція подій додана до даних, зібраних для цього етапу." msgstr "Колекція подій додана до даних, зібраних для цього етапу."
...@@ -2000,10 +2000,10 @@ msgid "The issue stage shows the time it takes from creating an issue to assigni ...@@ -2000,10 +2000,10 @@ msgid "The issue stage shows the time it takes from creating an issue to assigni
msgstr "Етап випуску показує, скільки часу потрібно від створення проблеми до присвоєння випуску, або додавання проблеми в вашу дошку проблем. Почніть створювати проблеми, щоб переглядати дані для цього етапу." msgstr "Етап випуску показує, скільки часу потрібно від створення проблеми до присвоєння випуску, або додавання проблеми в вашу дошку проблем. Почніть створювати проблеми, щоб переглядати дані для цього етапу."
msgid "The number of attempts GitLab will make to access a storage." msgid "The number of attempts GitLab will make to access a storage."
msgstr "" msgstr "Кількість спроб, які зробить GitLab для отримання доступу до сховища даних."
msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
msgstr "" msgstr "Кількість невдач, після чого GitLab почне тимчасово блокувати доступ до сховища на хості"
msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
msgstr "Кількість збоїв після якої Gitlab повністю заблокує доступ до сховища данних. Лічильник кількості збоїв може бути скинутий в інтерфейсі адміністратора (%{link_to_health_page}), або через %{api_documentation_link}." msgstr "Кількість збоїв після якої Gitlab повністю заблокує доступ до сховища данних. Лічильник кількості збоїв може бути скинутий в інтерфейсі адміністратора (%{link_to_health_page}), або через %{api_documentation_link}."
...@@ -2015,7 +2015,7 @@ msgid "The pipelines schedule runs pipelines in the future, repeatedly, for spec ...@@ -2015,7 +2015,7 @@ msgid "The pipelines schedule runs pipelines in the future, repeatedly, for spec
msgstr "Розклад конвеєрів запускає в майбутньому конвеєри, для певних гілок або тегів. Заплановані конвеєри успадковують обмеження на доступ до проекту на основі пов'язаного з ними користувача." msgstr "Розклад конвеєрів запускає в майбутньому конвеєри, для певних гілок або тегів. Заплановані конвеєри успадковують обмеження на доступ до проекту на основі пов'язаного з ними користувача."
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit." msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "На етапі планування відображається час від попереднього кроку до першого комміту. Додається автоматично, як тільки відправится перший комміт." msgstr "На етапі планування відображається час від попереднього кроку до першого коміту. Додається автоматично, як тільки відправится перший коміт."
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle." msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "Стадія ПРОДакшин показує загальний час між створенням проблеми та розгортанням коду у ПРОДакшині. Дані будуть автоматично додані після завершення повної ідеї до ПРОДакшин циклу." msgstr "Стадія ПРОДакшин показує загальний час між створенням проблеми та розгортанням коду у ПРОДакшині. Дані будуть автоматично додані після завершення повної ідеї до ПРОДакшин циклу."
...@@ -2090,10 +2090,10 @@ msgid "Timeago|%s days ago" ...@@ -2090,10 +2090,10 @@ msgid "Timeago|%s days ago"
msgstr "%s днів тому" msgstr "%s днів тому"
msgid "Timeago|%s days remaining" msgid "Timeago|%s days remaining"
msgstr "%s днів, що залишилися" msgstr "залишилося %s днів"
msgid "Timeago|%s hours remaining" msgid "Timeago|%s hours remaining"
msgstr "%s годин, що залишилися" msgstr "залишилося %s годин"
msgid "Timeago|%s minutes ago" msgid "Timeago|%s minutes ago"
msgstr "%s хвилин тому" msgstr "%s хвилин тому"
...@@ -2105,7 +2105,7 @@ msgid "Timeago|%s months ago" ...@@ -2105,7 +2105,7 @@ msgid "Timeago|%s months ago"
msgstr "%s місяці(в) тому" msgstr "%s місяці(в) тому"
msgid "Timeago|%s months remaining" msgid "Timeago|%s months remaining"
msgstr "%s місяці(в), що залишилися" msgstr "залишилося %s місяці(в)"
msgid "Timeago|%s seconds remaining" msgid "Timeago|%s seconds remaining"
msgstr "%s секунд, що залишаються" msgstr "%s секунд, що залишаються"
...@@ -2120,7 +2120,7 @@ msgid "Timeago|%s years ago" ...@@ -2120,7 +2120,7 @@ msgid "Timeago|%s years ago"
msgstr "%s років тому" msgstr "%s років тому"
msgid "Timeago|%s years remaining" msgid "Timeago|%s years remaining"
msgstr "%s роки, що залишилися" msgstr "залишилося %s роки"
msgid "Timeago|1 day remaining" msgid "Timeago|1 day remaining"
msgstr "Залишився 1 день" msgstr "Залишився 1 день"
...@@ -2228,7 +2228,7 @@ msgid "Total Time" ...@@ -2228,7 +2228,7 @@ msgid "Total Time"
msgstr "Загальний час" msgstr "Загальний час"
msgid "Total test time for all commits/merges" msgid "Total test time for all commits/merges"
msgstr "Загальний час, щоб перевірити всі фіксації/злиття" msgstr "Загальний час, щоб перевірити всі коміти/злиття"
msgid "Track activity with Contribution Analytics." msgid "Track activity with Contribution Analytics."
msgstr "Відстежувати активність за допомогою Аналітики контриб’юторів." msgstr "Відстежувати активність за допомогою Аналітики контриб’юторів."
...@@ -2489,7 +2489,7 @@ msgid "Your projects" ...@@ -2489,7 +2489,7 @@ msgid "Your projects"
msgstr "Ваші проекти" msgstr "Ваші проекти"
msgid "commit" msgid "commit"
msgstr "комміт" msgstr "коміт"
msgid "day" msgid "day"
msgid_plural "days" msgid_plural "days"
......
...@@ -3,7 +3,7 @@ msgstr "" ...@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: gitlab-ee\n" "Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-02 14:42+0100\n" "POT-Creation-Date: 2017-11-02 14:42+0100\n"
"PO-Revision-Date: 2017-11-06 01:25-0500\n" "PO-Revision-Date: 2017-11-23 02:44-0500\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Chinese Simplified\n" "Language-Team: Chinese Simplified\n"
"Language: zh_CN\n" "Language: zh_CN\n"
...@@ -656,10 +656,10 @@ msgid "ContainerRegistry|Created" ...@@ -656,10 +656,10 @@ msgid "ContainerRegistry|Created"
msgstr "已创建" msgstr "已创建"
msgid "ContainerRegistry|First log in to GitLab&rsquo;s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:" msgid "ContainerRegistry|First log in to GitLab&rsquo;s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:"
msgstr "首先使用您的 GitLab 用户名和密码登录 GitLab 的容器注册表。如果您有%{link_2fa},您需要使用%{link_token}:" msgstr "首先使用您的 GitLab 用户名和密码登录 GitLab 的容器注册表。如果您已经%{link_2fa},则需要使用%{link_token}:"
msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:" msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:"
msgstr "GitLab 最多支持3个级别的镜像名称。以下镜像示例对您的项目有效:" msgstr "GitLab 最多支持3个级别的镜像命名。以下镜像名称示例对当前项目有效:"
msgid "ContainerRegistry|How to use the Container Registry" msgid "ContainerRegistry|How to use the Container Registry"
msgstr "如何使用容器注册表" msgstr "如何使用容器注册表"
...@@ -671,7 +671,7 @@ msgid "ContainerRegistry|No tags in Container Registry for this container image. ...@@ -671,7 +671,7 @@ msgid "ContainerRegistry|No tags in Container Registry for this container image.
msgstr "容器注册表中没有此容器镜像的标签。" msgstr "容器注册表中没有此容器镜像的标签。"
msgid "ContainerRegistry|Once you log in, you&rsquo;re free to create and upload a container image using the common %{build} and %{push} commands" msgid "ContainerRegistry|Once you log in, you&rsquo;re free to create and upload a container image using the common %{build} and %{push} commands"
msgstr "登录后您可以使用通用的%{build}和%{push}命令自由创建和上传容器映像" msgstr "登录后您可以使用通用的%{build}和%{push}命令创建和上传容器镜像"
msgid "ContainerRegistry|Remove repository" msgid "ContainerRegistry|Remove repository"
msgstr "删除存储库" msgstr "删除存储库"
...@@ -692,7 +692,7 @@ msgid "ContainerRegistry|Use different image names" ...@@ -692,7 +692,7 @@ msgid "ContainerRegistry|Use different image names"
msgstr "使用不同的镜像名称" msgstr "使用不同的镜像名称"
msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images." msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images."
msgstr "将 Docker 容器注册表集成到 GitLab 中,每个项目都可以有自己的空间来存储 Docker 的图像。" msgstr "将 Docker 容器注册表集成到 GitLab 中,每个项目都可以有各自的空间来存储 Docker 的镜像。"
msgid "Contribution guide" msgid "Contribution guide"
msgstr "贡献指南" msgstr "贡献指南"
...@@ -1155,7 +1155,7 @@ msgid "Last update" ...@@ -1155,7 +1155,7 @@ msgid "Last update"
msgstr "最后更新" msgstr "最后更新"
msgid "Last updated" msgid "Last updated"
msgstr "最更新" msgstr "最更新"
msgid "LastPushEvent|You pushed to" msgid "LastPushEvent|You pushed to"
msgstr "您推送了" msgstr "您推送了"
...@@ -1274,7 +1274,7 @@ msgid "New tag" ...@@ -1274,7 +1274,7 @@ msgid "New tag"
msgstr "新建标签" msgstr "新建标签"
msgid "No container images stored for this project. Add one by following the instructions above." msgid "No container images stored for this project. Add one by following the instructions above."
msgstr "没有为此项目存储容器镜像。请按照上述说明添加一个。" msgstr "此项目当前未存储容器镜像。如需使用,请参照上述说明新建容器镜像。"
msgid "No repository" msgid "No repository"
msgstr "没有存储库" msgstr "没有存储库"
...@@ -1361,7 +1361,7 @@ msgid "Only project members can comment." ...@@ -1361,7 +1361,7 @@ msgid "Only project members can comment."
msgstr "只有项目成员可以发表评论。" msgstr "只有项目成员可以发表评论。"
msgid "OpenedNDaysAgo|Opened" msgid "OpenedNDaysAgo|Opened"
msgstr "开始于" msgstr "创建于"
msgid "Opens in a new window" msgid "Opens in a new window"
msgstr "打开一个新窗口" msgstr "打开一个新窗口"
...@@ -1775,10 +1775,10 @@ msgid "Settings" ...@@ -1775,10 +1775,10 @@ msgid "Settings"
msgstr "设置" msgstr "设置"
msgid "Show parent pages" msgid "Show parent pages"
msgstr "查看页面" msgstr "查看上级页面"
msgid "Show parent subgroups" msgid "Show parent subgroups"
msgstr "查看群组中的子群组" msgstr "查看上级子群组"
msgid "Showing %d event" msgid "Showing %d event"
msgid_plural "Showing %d events" msgid_plural "Showing %d events"
...@@ -1830,13 +1830,13 @@ msgid "SortOptions|Largest repository" ...@@ -1830,13 +1830,13 @@ msgid "SortOptions|Largest repository"
msgstr "最大存储库" msgstr "最大存储库"
msgid "SortOptions|Last created" msgid "SortOptions|Last created"
msgstr "最创建" msgstr "最创建"
msgid "SortOptions|Last joined" msgid "SortOptions|Last joined"
msgstr "最新加入" msgstr "最新加入"
msgid "SortOptions|Last updated" msgid "SortOptions|Last updated"
msgstr "最更新" msgstr "最更新"
msgid "SortOptions|Least popular" msgid "SortOptions|Least popular"
msgstr "最不受欢迎" msgstr "最不受欢迎"
...@@ -1869,7 +1869,7 @@ msgid "SortOptions|Name, descending" ...@@ -1869,7 +1869,7 @@ msgid "SortOptions|Name, descending"
msgstr "名称,降序排列" msgstr "名称,降序排列"
msgid "SortOptions|Oldest created" msgid "SortOptions|Oldest created"
msgstr "最早创建" msgstr "最早创建"
msgid "SortOptions|Oldest joined" msgid "SortOptions|Oldest joined"
msgstr "最早的加入" msgstr "最早的加入"
...@@ -1878,7 +1878,7 @@ msgid "SortOptions|Oldest sign in" ...@@ -1878,7 +1878,7 @@ msgid "SortOptions|Oldest sign in"
msgstr "最早的登录" msgstr "最早的登录"
msgid "SortOptions|Oldest updated" msgid "SortOptions|Oldest updated"
msgstr "最早的提交" msgstr "最早更新"
msgid "SortOptions|Popularity" msgid "SortOptions|Popularity"
msgstr "人气" msgstr "人气"
...@@ -1945,7 +1945,7 @@ msgid "Team" ...@@ -1945,7 +1945,7 @@ msgid "Team"
msgstr "团队" msgstr "团队"
msgid "Thanks! Don't show me this again" msgid "Thanks! Don't show me this again"
msgstr "谢谢 ! 请不要再显示" msgstr "不再显示该提示"
msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
msgstr "GitLab 中的高级全局搜索功能是非常强大的搜索服务。您可以搜索其他团队的代码以帮助您完善自己项目中的代码。从而避免创建重复的代码或浪费时间。" msgstr "GitLab 中的高级全局搜索功能是非常强大的搜索服务。您可以搜索其他团队的代码以帮助您完善自己项目中的代码。从而避免创建重复的代码或浪费时间。"
...@@ -2465,7 +2465,7 @@ msgstr "通知邮件" ...@@ -2465,7 +2465,7 @@ msgstr "通知邮件"
msgid "parent" msgid "parent"
msgid_plural "parents" msgid_plural "parents"
msgstr[0] "级" msgstr[0] "级"
msgid "password" msgid "password"
msgstr "密码" msgstr "密码"
......
...@@ -3,7 +3,7 @@ msgstr "" ...@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: gitlab-ee\n" "Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-02 14:42+0100\n" "POT-Creation-Date: 2017-11-02 14:42+0100\n"
"PO-Revision-Date: 2017-11-03 12:30-0400\n" "PO-Revision-Date: 2017-11-15 02:54-0500\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Chinese Traditional, Hong Kong\n" "Language-Team: Chinese Traditional, Hong Kong\n"
"Language: zh_HK\n" "Language: zh_HK\n"
...@@ -609,7 +609,7 @@ msgid "ClusterIntegration|properly configured" ...@@ -609,7 +609,7 @@ msgid "ClusterIntegration|properly configured"
msgstr "" msgstr ""
msgid "Comments" msgid "Comments"
msgstr "評論 (Comment)" msgstr "評論"
msgid "Commit" msgid "Commit"
msgid_plural "Commits" msgid_plural "Commits"
...@@ -876,7 +876,7 @@ msgid "EventFilterBy|Filter by all" ...@@ -876,7 +876,7 @@ msgid "EventFilterBy|Filter by all"
msgstr "全部" msgstr "全部"
msgid "EventFilterBy|Filter by comments" msgid "EventFilterBy|Filter by comments"
msgstr "按評論 (comment) 過濾" msgstr "按評論過濾"
msgid "EventFilterBy|Filter by issue events" msgid "EventFilterBy|Filter by issue events"
msgstr "按議題事件 (issue event) 過濾" msgstr "按議題事件 (issue event) 過濾"
......
...@@ -3,7 +3,7 @@ msgstr "" ...@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: gitlab-ee\n" "Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-02 14:42+0100\n" "POT-Creation-Date: 2017-11-02 14:42+0100\n"
"PO-Revision-Date: 2017-11-03 12:30-0400\n" "PO-Revision-Date: 2017-11-20 03:59-0500\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n" "Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Chinese Traditional\n" "Language-Team: Chinese Traditional\n"
"Language: zh_TW\n" "Language: zh_TW\n"
...@@ -26,20 +26,20 @@ msgstr[0] "%d 個圖層" ...@@ -26,20 +26,20 @@ msgstr[0] "%d 個圖層"
msgid "%s additional commit has been omitted to prevent performance issues." msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues." msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "因效能考量,不顯示 %s 個更動 (commit)。" msgstr[0] "因效能考量,已隱藏 %s 個更動 (commit)。"
msgid "%{commit_author_link} committed %{commit_timeago}" msgid "%{commit_author_link} committed %{commit_timeago}"
msgstr "%{commit_author_link} 在 %{commit_timeago} 送交" msgstr "%{commit_author_link} 在 %{commit_timeago} 送交"
msgid "%{count} participant" msgid "%{count} participant"
msgid_plural "%{count} participants" msgid_plural "%{count} participants"
msgstr[0] "" msgstr[0] "%{count} 參與者"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead" msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
msgstr "%{number_commits_behind} 個落後 %{default_branch} 分支的修訂版提交,%{number_commits_ahead} 個超前的修訂版提交" msgstr ""
msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt." msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt."
msgstr "已失敗 %{number_of_failures} 次,在失敗 %{maximum_failures} 次前 GitLab 會重試。" msgstr "目前已失敗 %{number_of_failures} 次。GitLab 允許在 %{maximum_failures} 次之內可再嘗試讀取 。"
msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will block access for %{number_of_seconds} seconds." msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will block access for %{number_of_seconds} seconds."
msgstr "已失敗 %{number_of_failures} 次,在失敗 %{maximum_failures} 次前 GitLab 會在 %{number_of_seconds} 秒後重試。" msgstr "已失敗 %{number_of_failures} 次,在失敗 %{maximum_failures} 次前 GitLab 會在 %{number_of_seconds} 秒後重試。"
...@@ -55,10 +55,10 @@ msgid "(checkout the %{link} for information on how to install it)." ...@@ -55,10 +55,10 @@ msgid "(checkout the %{link} for information on how to install it)."
msgstr "(如何安裝請參閱 %{link})" msgstr "(如何安裝請參閱 %{link})"
msgid "+ %{moreCount} more" msgid "+ %{moreCount} more"
msgstr "" msgstr "+ %{moreCount} 更多"
msgid "- show less" msgid "- show less"
msgstr "" msgstr "顯示較少"
msgid "1 pipeline" msgid "1 pipeline"
msgid_plural "%d pipelines" msgid_plural "%d pipelines"
...@@ -104,28 +104,28 @@ msgid "Add Contribution guide" ...@@ -104,28 +104,28 @@ msgid "Add Contribution guide"
msgstr "新增協作指南" msgstr "新增協作指南"
msgid "Add Group Webhooks and GitLab Enterprise Edition." msgid "Add Group Webhooks and GitLab Enterprise Edition."
msgstr "加入來自 Webhooks 或者是 GitHub 企業版的團隊" msgstr "加入來自 Webhooks 或者是 GitLab 企業版的群組"
msgid "Add License" msgid "Add License"
msgstr "新增授權條款" msgstr "新增授權條款"
msgid "Add an SSH key to your profile to pull or push via SSH." msgid "Add an SSH key to your profile to pull or push via SSH."
msgstr "請先新增 SSH 金鑰到您的個人帳號,才能使用 SSH 來上傳 (push) 或下載 (pull) 。" msgstr "將 SSH 金鑰新增至您的個人帳號後, 即可透過 SSH 來上傳 (push) 或下載 (pull) 。"
msgid "Add new directory" msgid "Add new directory"
msgstr "新增目錄" msgstr "新增目錄"
msgid "AdminHealthPageLink|health page" msgid "AdminHealthPageLink|health page"
msgstr "" msgstr "系統狀態"
msgid "Advanced settings" msgid "Advanced settings"
msgstr "" msgstr "進階設定"
msgid "All" msgid "All"
msgstr "全部" msgstr "全部"
msgid "An error occurred. Please try again." msgid "An error occurred. Please try again."
msgstr "" msgstr "發生錯誤,請再試一次。"
msgid "Appearance" msgid "Appearance"
msgstr "外觀" msgstr "外觀"
...@@ -143,7 +143,7 @@ msgid "Are you sure you want to discard your changes?" ...@@ -143,7 +143,7 @@ msgid "Are you sure you want to discard your changes?"
msgstr "確定要放棄修改嗎?" msgstr "確定要放棄修改嗎?"
msgid "Are you sure you want to leave this group?" msgid "Are you sure you want to leave this group?"
msgstr "" msgstr "確定要離開這個群組嗎?"
msgid "Are you sure you want to reset registration token?" msgid "Are you sure you want to reset registration token?"
msgstr "確定要重置註冊憑證 (registration token) 嗎?" msgstr "確定要重置註冊憑證 (registration token) 嗎?"
...@@ -155,28 +155,28 @@ msgid "Are you sure?" ...@@ -155,28 +155,28 @@ msgid "Are you sure?"
msgstr "確定嗎?" msgstr "確定嗎?"
msgid "Artifacts" msgid "Artifacts"
msgstr "產物" msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}" msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "拖放檔案到此處或者 %{upload_link}" msgstr "拖放檔案到此處或者 %{upload_link}"
msgid "Authentication Log" msgid "Authentication Log"
msgstr "驗證 Log" msgstr "登入紀錄"
msgid "Author" msgid "Author"
msgstr "作者" msgstr "作者"
msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly." msgid "Auto Review Apps and Auto Deploy need a domain name and the %{kubernetes} to work correctly."
msgstr "自動審查程序 & 自動部屬程序需要一個網域和 %{kubernetes} 才能運作。" msgstr "自動複閱應用 (review apps) 與自動部署需要網域和 %{kubernetes} 才能運作。"
msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly." msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly."
msgstr "自動審查程序 & 自動部屬程序需要一個網域才能正常運作。" msgstr "自動複閱應用 (review apps) 與自動部署需要網域才能運作。"
msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly." msgid "Auto Review Apps and Auto Deploy need the %{kubernetes} to work correctly."
msgstr "自動審查程序 & 自動部屬程序需要 %{kubernetes} 才能正常運作。" msgstr "自動複閱應用 (review apps) 與自動部署需要 %{kubernetes} 才能運作。"
msgid "AutoDevOps|Auto DevOps (Beta)" msgid "AutoDevOps|Auto DevOps (Beta)"
msgstr "DevOps 自動化 (測試版)" msgstr "DevOps 自動化(beta)"
msgid "AutoDevOps|Auto DevOps documentation" msgid "AutoDevOps|Auto DevOps documentation"
msgstr "「DevOps 自動化」 文件" msgstr "「DevOps 自動化」 文件"
...@@ -185,13 +185,13 @@ msgid "AutoDevOps|Enable in settings" ...@@ -185,13 +185,13 @@ msgid "AutoDevOps|Enable in settings"
msgstr "在設定中啟用" msgstr "在設定中啟用"
msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration." msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
msgstr "" msgstr "將根據設定的的 CI / CD 流程自動建構、測試和部署應用程式。"
msgid "AutoDevOps|Learn more in the %{link_to_documentation}" msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
msgstr "了解更多於 %{link_to_documentation}" msgstr "了解更多於 %{link_to_documentation}"
msgid "AutoDevOps|You can activate %{link_to_settings} for this project." msgid "AutoDevOps|You can activate %{link_to_settings} for this project."
msgstr "" msgstr "你可以為此專案啟動 %{link_to_settings}"
msgid "Billing" msgid "Billing"
msgstr "方案" msgstr "方案"
...@@ -224,16 +224,16 @@ msgid "BillingPlans|See all %{plan_name} features" ...@@ -224,16 +224,16 @@ msgid "BillingPlans|See all %{plan_name} features"
msgstr "查看更多 %{plan_name} 功能" msgstr "查看更多 %{plan_name} 功能"
msgid "BillingPlans|This group uses the plan associated with its parent group." msgid "BillingPlans|This group uses the plan associated with its parent group."
msgstr "此群組使用和上層群組相同的方案。" msgstr "此群組與上層群組使用相同的方案。"
msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}." msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
msgstr "要管理這個群組的方案,請瀏覽 %{parent_billing_page_link} 的計費部分。" msgstr "請至 %{parent_billing_page_link} 來管理此群組的方案。"
msgid "BillingPlans|Upgrade" msgid "BillingPlans|Upgrade"
msgstr "升級" msgstr "升級"
msgid "BillingPlans|You are currently on the %{plan_link} plan." msgid "BillingPlans|You are currently on the %{plan_link} plan."
msgstr "你目前正在使用方案 %{plan_link}" msgstr "目前使用 %{plan_link} 方案。"
msgid "BillingPlans|frequently asked questions" msgid "BillingPlans|frequently asked questions"
msgstr "常見問題" msgstr "常見問題"
...@@ -242,20 +242,20 @@ msgid "BillingPlans|monthly" ...@@ -242,20 +242,20 @@ msgid "BillingPlans|monthly"
msgstr "每個月" msgstr "每個月"
msgid "BillingPlans|paid annually at %{price_per_year}" msgid "BillingPlans|paid annually at %{price_per_year}"
msgstr "每年支付 %{price_per_year}" msgstr "每年收取 %{price_per_year}"
msgid "BillingPlans|per user" msgid "BillingPlans|per user"
msgstr "每使用者" msgstr "每使用者"
msgid "Branch" msgid "Branch"
msgid_plural "Branches" msgid_plural "Branches"
msgstr[0] "分支 (branch) " msgstr[0] "分支 (branch) "
msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}" msgid "Branch <strong>%{branch_name}</strong> was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}"
msgstr "已建立分支 (branch) <strong>%{branch_name}</strong> 。如要設定自動部署, 請選擇合適的 GitLab CI Yaml 模板,然後記得要送交 (commit) 您的編輯內容。%{link_to_autodeploy_doc}\n" msgstr "已建立分支 (branch) <strong>%{branch_name}</strong> 。如需設定自動部署, 在選擇合適的 GitLab CI Yaml 模板後,請送交 (commit) 您的編輯內容。%{link_to_autodeploy_doc}"
msgid "Branch has changed" msgid "Branch has changed"
msgstr "" msgstr "分支(branch)已變更"
msgid "BranchSwitcherPlaceholder|Search branches" msgid "BranchSwitcherPlaceholder|Search branches"
msgstr "搜尋分支 (branches)" msgstr "搜尋分支 (branches)"
...@@ -267,7 +267,7 @@ msgid "Branches" ...@@ -267,7 +267,7 @@ msgid "Branches"
msgstr "分支 (branch) " msgstr "分支 (branch) "
msgid "Branches|Cant find HEAD commit for this branch" msgid "Branches|Cant find HEAD commit for this branch"
msgstr "不能找到這個分支的 HEAD 更動。" msgstr "找不到此分支的 HEAD 更動。"
msgid "Branches|Compare" msgid "Branches|Compare"
msgstr "比較" msgstr "比較"
...@@ -285,19 +285,19 @@ msgid "Branches|Delete protected branch" ...@@ -285,19 +285,19 @@ msgid "Branches|Delete protected branch"
msgstr "移除受保護的分支" msgstr "移除受保護的分支"
msgid "Branches|Delete protected branch '%{branch_name}'?" msgid "Branches|Delete protected branch '%{branch_name}'?"
msgstr "確定要移除「%{branch_name}」這個受保護的分支嗎 ?" msgstr "確定移除受保護的分支 %{branch_name} ?"
msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?" msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?"
msgstr "移除 %{branch_name} 分支將無法還原,你確定?" msgstr "移除 %{branch_name} 分支將無法還原,確定嗎?"
msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?" msgid "Branches|Deleting the merged branches cannot be undone. Are you sure?"
msgstr "移除已經合併的分支後將無法還原,你確定?" msgstr "移除已合併的分支後將無法還原。您確定要執行?"
msgid "Branches|Filter by branch name" msgid "Branches|Filter by branch name"
msgstr "分支名稱篩選" msgstr "分支名稱篩選"
msgid "Branches|Merged into %{default_branch}" msgid "Branches|Merged into %{default_branch}"
msgstr "合併到 %{default_branch}" msgstr "已合併至 %{default_branch}"
msgid "Branches|New branch" msgid "Branches|New branch"
msgstr "新增分支" msgstr "新增分支"
...@@ -306,7 +306,7 @@ msgid "Branches|No branches to show" ...@@ -306,7 +306,7 @@ msgid "Branches|No branches to show"
msgstr "找不到分支" msgstr "找不到分支"
msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered." msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot be undone or recovered."
msgstr "當你確認並按下 %{delete_protected_branch},他將無法撤銷或還原。" msgstr "一旦你確認並按下 %{delete_protected_branch} 之後,此動作將無法撤銷或還原。"
msgid "Branches|Only a project master or owner can delete a protected branch" msgid "Branches|Only a project master or owner can delete a protected branch"
msgstr "只有專案管理者或擁有者才能刪除被保護的分支。" msgstr "只有專案管理者或擁有者才能刪除被保護的分支。"
...@@ -327,19 +327,19 @@ msgid "Branches|This branch hasn’t been merged into %{default_branch}." ...@@ -327,19 +327,19 @@ msgid "Branches|This branch hasn’t been merged into %{default_branch}."
msgstr "這個分支尚未合併到 %{default_branch}" msgstr "這個分支尚未合併到 %{default_branch}"
msgid "Branches|To avoid data loss, consider merging this branch before deleting it." msgid "Branches|To avoid data loss, consider merging this branch before deleting it."
msgstr "為避免資料丟失,請在刪除之前合併該分支。" msgstr "為避免資料遺失,請合併該分支後再將它刪除。"
msgid "Branches|To confirm, type %{branch_name_confirmation}:" msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr "為了確認,請輸入 %{branch_name_confirmation} :" msgstr "請輸入 %{branch_name_confirmation} 以進行確認 :"
msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above." msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
msgstr "為了捨棄目前變更並使用上游版本覆蓋本分支,請先刪除並按下 \"立刻更新\"。" msgstr ""
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}." msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr "你將永久刪除受保護的 %{branch_name} 分支。" msgstr "你將永久刪除受保護的 %{branch_name} 分支。"
msgid "Branches|diverged from upstream" msgid "Branches|diverged from upstream"
msgstr "與上游存在差異" msgstr "與上游分歧"
msgid "Branches|merged" msgid "Branches|merged"
msgstr "已合併" msgstr "已合併"
...@@ -411,7 +411,7 @@ msgid "Cherry-pick this merge request" ...@@ -411,7 +411,7 @@ msgid "Cherry-pick this merge request"
msgstr "挑選此合併請求 (merge request) " msgstr "挑選此合併請求 (merge request) "
msgid "Choose which groups you wish to replicate to this secondary node. Leave blank to replicate all." msgid "Choose which groups you wish to replicate to this secondary node. Leave blank to replicate all."
msgstr "選擇哪個群組是你要複製到第二節點的。留白則複製全部。" msgstr "選擇你想要複製到第二節點的群組。若留白則會複製全部的群組。"
msgid "CiStatusLabel|canceled" msgid "CiStatusLabel|canceled"
msgstr "已取消" msgstr "已取消"
...@@ -435,7 +435,7 @@ msgid "CiStatusLabel|pending" ...@@ -435,7 +435,7 @@ msgid "CiStatusLabel|pending"
msgstr "等待中" msgstr "等待中"
msgid "CiStatusLabel|skipped" msgid "CiStatusLabel|skipped"
msgstr "已過" msgstr "已過"
msgid "CiStatusLabel|waiting for manual action" msgid "CiStatusLabel|waiting for manual action"
msgstr "等待手動操作" msgstr "等待手動操作"
...@@ -462,151 +462,151 @@ msgid "CiStatusText|pending" ...@@ -462,151 +462,151 @@ msgid "CiStatusText|pending"
msgstr "等待中" msgstr "等待中"
msgid "CiStatusText|skipped" msgid "CiStatusText|skipped"
msgstr "已過" msgstr "已過"
msgid "CiStatus|running" msgid "CiStatus|running"
msgstr "執行中" msgstr "執行中"
msgid "CircuitBreakerApiLink|circuitbreaker api" msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr "" msgstr "斷路器 (circuitbreaker) API"
msgid "Clone repository" msgid "Clone repository"
msgstr "克隆倉庫" msgstr "複製(clone)檔案庫(repository)"
msgid "Close" msgid "Close"
msgstr "關閉" msgstr "關閉"
msgid "Cluster" msgid "Cluster"
msgstr "" msgstr "叢集"
msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account" msgid "ClusterIntegration|A %{link_to_container_project} must have been created under this account"
msgstr "" msgstr "必須在此帳號下建立 %{link_to_container_project}"
msgid "ClusterIntegration|Cluster details" msgid "ClusterIntegration|Cluster details"
msgstr "" msgstr "叢集詳情"
msgid "ClusterIntegration|Cluster integration" msgid "ClusterIntegration|Cluster integration"
msgstr "" msgstr "叢集整合"
msgid "ClusterIntegration|Cluster integration is disabled for this project." msgid "ClusterIntegration|Cluster integration is disabled for this project."
msgstr "" msgstr "此專案已經禁用叢集整合"
msgid "ClusterIntegration|Cluster integration is enabled for this project." msgid "ClusterIntegration|Cluster integration is enabled for this project."
msgstr "" msgstr "此專案已經啟用叢集整合"
msgid "ClusterIntegration|Cluster integration is enabled for this project. Disabling this integration will not affect your cluster, it will only temporarily turn off GitLab's connection to it." msgid "ClusterIntegration|Cluster integration is enabled for this project. Disabling this integration will not affect your cluster, it will only temporarily turn off GitLab's connection to it."
msgstr "" msgstr "此專案已啟用叢集整合。禁止叢集整合不會影響您的叢集,它只是暫時關閉 GitLab 的連接。"
msgid "ClusterIntegration|Cluster is being created on Google Container Engine..." msgid "ClusterIntegration|Cluster is being created on Google Container Engine..."
msgstr "" msgstr "在 Google 容器引擎中建立新的叢集"
msgid "ClusterIntegration|Cluster name" msgid "ClusterIntegration|Cluster name"
msgstr "" msgstr "叢集名稱"
msgid "ClusterIntegration|Cluster was successfully created on Google Container Engine" msgid "ClusterIntegration|Cluster was successfully created on Google Container Engine"
msgstr "" msgstr "在 Google 容器引擎上成功建立叢集"
msgid "ClusterIntegration|Copy cluster name" msgid "ClusterIntegration|Copy cluster name"
msgstr "" msgstr "複製叢集名稱"
msgid "ClusterIntegration|Create cluster" msgid "ClusterIntegration|Create cluster"
msgstr "" msgstr "建立叢集"
msgid "ClusterIntegration|Create new cluster on Google Container Engine" msgid "ClusterIntegration|Create new cluster on Google Container Engine"
msgstr "" msgstr "在 Google 容器引擎中建立新的叢集"
msgid "ClusterIntegration|Enable cluster integration" msgid "ClusterIntegration|Enable cluster integration"
msgstr "" msgstr "啟動叢集整合"
msgid "ClusterIntegration|Google Cloud Platform project ID" msgid "ClusterIntegration|Google Cloud Platform project ID"
msgstr "" msgstr "Google 雲端專案 ID"
msgid "ClusterIntegration|Google Container Engine" msgid "ClusterIntegration|Google Container Engine"
msgstr "" msgstr "Google 容器引擎"
msgid "ClusterIntegration|Google Container Engine project" msgid "ClusterIntegration|Google Container Engine project"
msgstr "" msgstr "Google 容器引擎專案"
msgid "ClusterIntegration|Learn more about %{link_to_documentation}" msgid "ClusterIntegration|Learn more about %{link_to_documentation}"
msgstr "" msgstr "學習更多有關於%{link_to_documentation}"
msgid "ClusterIntegration|Machine type" msgid "ClusterIntegration|Machine type"
msgstr "" msgstr "機器型別"
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters" msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create clusters"
msgstr "" msgstr "請確認您的帳戶中%{link_to_requirements} 是否建立叢集"
msgid "ClusterIntegration|Manage Cluster integration on your GitLab project" msgid "ClusterIntegration|Manage Cluster integration on your GitLab project"
msgstr "" msgstr "在你的 GitLab 專案上管理叢集整合"
msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}" msgid "ClusterIntegration|Manage your cluster by visiting %{link_gke}"
msgstr "" msgstr "請至 %{link_gke} 管理你的叢集"
msgid "ClusterIntegration|Number of nodes" msgid "ClusterIntegration|Number of nodes"
msgstr "" msgstr "所有的端點數量"
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:" msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
msgstr "" msgstr "請確認你的 Google 帳號是否符合這些條件"
msgid "ClusterIntegration|Project namespace (optional, unique)" msgid "ClusterIntegration|Project namespace (optional, unique)"
msgstr "" msgstr "專案命名空間(選填,不可重複)"
msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration." msgid "ClusterIntegration|Read our %{link_to_help_page} on cluster integration."
msgstr "" msgstr ""
msgid "ClusterIntegration|Remove cluster integration" msgid "ClusterIntegration|Remove cluster integration"
msgstr "" msgstr "刪除叢集整合"
msgid "ClusterIntegration|Remove integration" msgid "ClusterIntegration|Remove integration"
msgstr "" msgstr "刪除整合"
msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project." msgid "ClusterIntegration|Removing cluster integration will remove the cluster configuration you have added to this project. It will not delete your project."
msgstr "" msgstr "當刪除叢集需要加入專案的定義組態檔,會刪除叢集整合。這並不會刪除你的專案。 刪除叢集的同時,將一起刪除已加入此專案的定義組態檔,但你的專案不會因此被刪除。"
msgid "ClusterIntegration|See and edit the details for your cluster" msgid "ClusterIntegration|See and edit the details for your cluster"
msgstr "" msgstr "查看與編輯你的叢集內容"
msgid "ClusterIntegration|See machine types" msgid "ClusterIntegration|See machine types"
msgstr "" msgstr "查看機器型別"
msgid "ClusterIntegration|See your projects" msgid "ClusterIntegration|See your projects"
msgstr "" msgstr "查看您的專案"
msgid "ClusterIntegration|See zones" msgid "ClusterIntegration|See zones"
msgstr "" msgstr "查看區域"
msgid "ClusterIntegration|Something went wrong on our end." msgid "ClusterIntegration|Something went wrong on our end."
msgstr "" msgstr "內部發生了錯誤"
msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine" msgid "ClusterIntegration|Something went wrong while creating your cluster on Google Container Engine"
msgstr "" msgstr "在 Google Container Engine 上建立叢集時發生了錯誤"
msgid "ClusterIntegration|Toggle Cluster" msgid "ClusterIntegration|Toggle Cluster"
msgstr "" msgstr "叢集開關"
msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way." msgid "ClusterIntegration|With a cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
msgstr "" msgstr "當叢集連結到此專案,你可以使用複閱應用 (review apps),部署你的應用程式,執行你的流水線 (pipelines),還有更多容易上手的方式可以使用。"
msgid "ClusterIntegration|Your account must have %{link_to_container_engine}" msgid "ClusterIntegration|Your account must have %{link_to_container_engine}"
msgstr "" msgstr "您的帳號必須有 %{link_to_container_engine}"
msgid "ClusterIntegration|Zone" msgid "ClusterIntegration|Zone"
msgstr "" msgstr "區域"
msgid "ClusterIntegration|access to Google Container Engine" msgid "ClusterIntegration|access to Google Container Engine"
msgstr "" msgstr "存取 Google Container Engine"
msgid "ClusterIntegration|cluster" msgid "ClusterIntegration|cluster"
msgstr "" msgstr "叢集"
msgid "ClusterIntegration|help page" msgid "ClusterIntegration|help page"
msgstr "" msgstr "說明頁面"
msgid "ClusterIntegration|meets the requirements" msgid "ClusterIntegration|meets the requirements"
msgstr "" msgstr "符合需求"
msgid "ClusterIntegration|properly configured" msgid "ClusterIntegration|properly configured"
msgstr "" msgstr "設定正確"
msgid "Comments" msgid "Comments"
msgstr "留言" msgstr "留言"
...@@ -617,13 +617,13 @@ msgstr[0] "更動記錄 (commit) " ...@@ -617,13 +617,13 @@ msgstr[0] "更動記錄 (commit) "
msgid "Commit %d file" msgid "Commit %d file"
msgid_plural "Commit %d files" msgid_plural "Commit %d files"
msgstr[0] "" msgstr[0] "提交 %d 個檔案"
msgid "Commit Message" msgid "Commit Message"
msgstr "更動訊息" msgstr "更動訊息"
msgid "Commit duration in minutes for last 30 commits" msgid "Commit duration in minutes for last 30 commits"
msgstr "最近 30 次更動花費的時間(分鐘)" msgstr "最近 30 次更動花費的時間(分鐘)"
msgid "Commit message" msgid "Commit message"
msgstr "更動說明 (commit) " msgstr "更動說明 (commit) "
...@@ -641,7 +641,7 @@ msgid "Commits feed" ...@@ -641,7 +641,7 @@ msgid "Commits feed"
msgstr "更動摘要 (commit feed)" msgstr "更動摘要 (commit feed)"
msgid "Commits|History" msgid "Commits|History"
msgstr "過去更動 (commit) " msgstr "更動紀錄 (commit)"
msgid "Committed by" msgid "Committed by"
msgstr "送交者為 " msgstr "送交者為 "
...@@ -650,49 +650,49 @@ msgid "Compare" ...@@ -650,49 +650,49 @@ msgid "Compare"
msgstr "比較" msgstr "比較"
msgid "Container Registry" msgid "Container Registry"
msgstr "" msgstr "Container Registry"
msgid "ContainerRegistry|Created" msgid "ContainerRegistry|Created"
msgstr "" msgstr "已建立"
msgid "ContainerRegistry|First log in to GitLab&rsquo;s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:" msgid "ContainerRegistry|First log in to GitLab&rsquo;s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:"
msgstr "" msgstr "請先使用你的 Gitlab 帳號來登入 Gitlab 的 Container Registry。如果你有 %{link_2fa} ,你必須使用 %{link_token}:"
msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:" msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:"
msgstr "" msgstr "GitLab 支援多達 3 級的映像檔名稱。以下映像檔範例對您的專案有幫助:"
msgid "ContainerRegistry|How to use the Container Registry" msgid "ContainerRegistry|How to use the Container Registry"
msgstr "" msgstr "如何使用 Container Registry"
msgid "ContainerRegistry|Learn more about" msgid "ContainerRegistry|Learn more about"
msgstr "" msgstr "了解更多"
msgid "ContainerRegistry|No tags in Container Registry for this container image." msgid "ContainerRegistry|No tags in Container Registry for this container image."
msgstr "" msgstr "在這個 Container Registry 中不包含任何有標籤的容器映像檔"
msgid "ContainerRegistry|Once you log in, you&rsquo;re free to create and upload a container image using the common %{build} and %{push} commands" msgid "ContainerRegistry|Once you log in, you&rsquo;re free to create and upload a container image using the common %{build} and %{push} commands"
msgstr "" msgstr "當您登入後,您可以透過 %{build} 和 %{push} 指令來自由建立和上傳容器映像檔 (container image)"
msgid "ContainerRegistry|Remove repository" msgid "ContainerRegistry|Remove repository"
msgstr "" msgstr "刪除檔案庫(repository)"
msgid "ContainerRegistry|Remove tag" msgid "ContainerRegistry|Remove tag"
msgstr "" msgstr "刪除標籤"
msgid "ContainerRegistry|Size" msgid "ContainerRegistry|Size"
msgstr "" msgstr ""
msgid "ContainerRegistry|Tag" msgid "ContainerRegistry|Tag"
msgstr "" msgstr "標籤"
msgid "ContainerRegistry|Tag ID" msgid "ContainerRegistry|Tag ID"
msgstr "" msgstr "標籤 ID"
msgid "ContainerRegistry|Use different image names" msgid "ContainerRegistry|Use different image names"
msgstr "" msgstr "使用不同的映像檔名稱"
msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images." msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images."
msgstr "" msgstr "將 Docker Container Registry 整合到 GitLab 中後,每個專案都可以有自己的空間來儲存 Docker 的映像檔"
msgid "Contribution guide" msgid "Contribution guide"
msgstr "協作指南" msgstr "協作指南"
...@@ -701,13 +701,13 @@ msgid "Contributors" ...@@ -701,13 +701,13 @@ msgid "Contributors"
msgstr "協作者" msgstr "協作者"
msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node" msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
msgstr "" msgstr "控制次節點 (secondary node) 同步 LFS 和附檔的最大並行率 (concurrency)"
msgid "Control the maximum concurrency of repository backfill for this secondary node" msgid "Control the maximum concurrency of repository backfill for this secondary node"
msgstr "" msgstr "控制次節點 (secondary node) 同步檔案庫 (repository) 的最大並行率 (concurrency)"
msgid "Copy SSH public key to clipboard" msgid "Copy SSH public key to clipboard"
msgstr "複製 SSH 鑰到剪貼簿" msgstr "複製 SSH 鑰到剪貼簿"
msgid "Copy URL to clipboard" msgid "Copy URL to clipboard"
msgstr "複製網址到剪貼簿" msgstr "複製網址到剪貼簿"
...@@ -728,19 +728,19 @@ msgid "Create empty bare repository" ...@@ -728,19 +728,19 @@ msgid "Create empty bare repository"
msgstr "建立一個新的 bare repository" msgstr "建立一個新的 bare repository"
msgid "Create file" msgid "Create file"
msgstr "" msgstr "新增檔案"
msgid "Create merge request" msgid "Create merge request"
msgstr "發出合併請求 (merge request) " msgstr "發出合併請求 (merge request) "
msgid "Create new branch" msgid "Create new branch"
msgstr "" msgstr "新增分支(branch)"
msgid "Create new directory" msgid "Create new directory"
msgstr "" msgstr "新增資料夾"
msgid "Create new file" msgid "Create new file"
msgstr "" msgstr "新增檔案"
msgid "Create new..." msgid "Create new..."
msgstr "建立..." msgstr "建立..."
...@@ -764,13 +764,13 @@ msgid "Custom notification events" ...@@ -764,13 +764,13 @@ msgid "Custom notification events"
msgstr "自訂事件通知" msgstr "自訂事件通知"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}." msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "自訂通知層級相當於參與度設定。使用自訂通知層級,您可以只收到特定的事件通知。請參照 %{notification_link} 以獲得更多訊息。" msgstr "自訂通知的等級與參與度設定相同。使用自訂通知讓你只收到特定的事件通知。想了解更多資訊,請查閱 %{notification_link} 。"
msgid "Cycle Analytics" msgid "Cycle Analytics"
msgstr "週期分析" msgstr "週期分析"
msgid "Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project." msgid "Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project."
msgstr "週期分析讓您可以有效的釐清專案從發想到產品推出所花的時間長短。" msgstr "週期分析讓你可以有效地釐清專案從發想到產品推出所花費的時間。"
msgid "CycleAnalyticsStage|Code" msgid "CycleAnalyticsStage|Code"
msgstr "程式開發" msgstr "程式開發"
...@@ -816,7 +816,7 @@ msgid "Description" ...@@ -816,7 +816,7 @@ msgid "Description"
msgstr "描述" msgstr "描述"
msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project." msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
msgstr "描述範本允許你為項目的議題和合併請求在建立時選擇特定的範本。" msgstr "描述範本 (Description templates) 讓你在建立專案的議題 (Issue) 和合併請求時可以選擇特定的範本。"
msgid "Details" msgid "Details"
msgstr "細節" msgstr "細節"
...@@ -828,10 +828,10 @@ msgid "Discard changes" ...@@ -828,10 +828,10 @@ msgid "Discard changes"
msgstr "放棄修改" msgstr "放棄修改"
msgid "Dismiss Cycle Analytics introduction box" msgid "Dismiss Cycle Analytics introduction box"
msgstr "" msgstr "關閉循環分析介紹視窗"
msgid "Dismiss Merge Request promotion" msgid "Dismiss Merge Request promotion"
msgstr "關閉合併請求中的促銷廣告" msgstr ""
msgid "Don't show again" msgid "Don't show again"
msgstr "不再顯示" msgstr "不再顯示"
...@@ -900,10 +900,10 @@ msgid "Every week (Sundays at 4:00am)" ...@@ -900,10 +900,10 @@ msgid "Every week (Sundays at 4:00am)"
msgstr "每週執行(週日淩晨 四點)" msgstr "每週執行(週日淩晨 四點)"
msgid "Explore projects" msgid "Explore projects"
msgstr "瀏覽項目" msgstr "瀏覽專案"
msgid "Explore public groups" msgid "Explore public groups"
msgstr "" msgstr "搜尋公開的群組"
msgid "Failed to change the owner" msgid "Failed to change the owner"
msgstr "無法變更所有權" msgstr "無法變更所有權"
...@@ -912,7 +912,7 @@ msgid "Failed to remove the pipeline schedule" ...@@ -912,7 +912,7 @@ msgid "Failed to remove the pipeline schedule"
msgstr "無法刪除流水線 (pipeline) 排程" msgstr "無法刪除流水線 (pipeline) 排程"
msgid "File name" msgid "File name"
msgstr "" msgstr "檔案名稱"
msgid "Files" msgid "Files"
msgstr "檔案" msgstr "檔案"
...@@ -958,13 +958,13 @@ msgid "Geo Nodes" ...@@ -958,13 +958,13 @@ msgid "Geo Nodes"
msgstr "Geo 節點" msgstr "Geo 節點"
msgid "Geo|File sync capacity" msgid "Geo|File sync capacity"
msgstr "" msgstr "檔案同步容量"
msgid "Geo|Groups to replicate" msgid "Geo|Groups to replicate"
msgstr "要複製的群組" msgstr "要複製的群組"
msgid "Geo|Repository sync capacity" msgid "Geo|Repository sync capacity"
msgstr "" msgstr "檔案庫(repository)同步量"
msgid "Geo|Select groups to replicate." msgid "Geo|Select groups to replicate."
msgstr "選擇欲複製之群組。" msgstr "選擇欲複製之群組。"
...@@ -982,76 +982,76 @@ msgid "GoToYourFork|Fork" ...@@ -982,76 +982,76 @@ msgid "GoToYourFork|Fork"
msgstr "前往您的分支 (fork) " msgstr "前往您的分支 (fork) "
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service." msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "" msgstr "Google 身份驗證不是 %{link_to_documentation}。如果您想使用此服務,請諮詢管理員。"
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups" msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "禁止與其他群組共享 %{group} 中的項目" msgstr "禁止與其他群組共享 %{group} 中的專案"
msgid "GroupSettings|Share with group lock" msgid "GroupSettings|Share with group lock"
msgstr "分享群組鎖" msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup." msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
msgstr "這個設定已經套用至 %{ancestor_group},並已經覆蓋此子組的設定。" msgstr "這個設定已經套用至 %{ancestor_group},並覆蓋了它的子群組設定。"
msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}." msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "此設定已經套用在 %{ancestor_group}。若要與其他群組共享此群組中的項目,請聯繫擁有者覆蓋這個設定或者 %{remove_ancestor_share_with_group_lock}" msgstr "此設定已經套用在 %{ancestor_group}。若要與其他群組共享此群組中的專案,請聯繫擁有者覆蓋這個設定或者 %{remove_ancestor_share_with_group_lock}"
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}." msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
msgstr "此設定已經套用至 %{ancestor_group}。你可以覆蓋此設定或是 %{remove_ancestor_share_with_group_lock}" msgstr "此設定已經套用至 %{ancestor_group}。你可以覆蓋此設定或是 %{remove_ancestor_share_with_group_lock}"
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually." msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
msgstr "此設定將套用在所有子組,除非群組擁有者覆蓋。已經有權限瀏覽本項目的群組將仍可瀏覽,除非手動移除。" msgstr "除非群組擁有者覆蓋此設定,否則此設定將套用在所有子群組。此外,如果沒有手動移除原本已經擁有瀏覽專案權限的群組,這些群組仍可繼續瀏覽。"
msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group" msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group"
msgstr "無法調用父組的 \"共享群組鎖\",僅父群組的所有者才可操作。" msgstr "無法啟用上級群組的「共享群組鎖」。只有上級群組的所有者才可啟用。"
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}" msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "從 %{ancestor_group_name} 中移除共享群組鎖" msgstr "從 %{ancestor_group_name} 中移除共享群組鎖"
msgid "GroupsEmptyState|A group is a collection of several projects." msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr "" msgstr "群組是數個專案的集合。"
msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder." msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
msgstr "" msgstr "當你在群組下建立一個專案,這個專案的運作方式就如同一個資料夾。"
msgid "GroupsEmptyState|No groups found" msgid "GroupsEmptyState|No groups found"
msgstr "" msgstr "找不到群組"
msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group." msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
msgstr "" msgstr "你可以管理群組內所有成員的每個專案的存取權限"
msgid "GroupsTreeRole|as" msgid "GroupsTreeRole|as"
msgstr "" msgstr ""
msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?" msgid "GroupsTree|Are you sure you want to leave the \"${this.group.fullName}\" group?"
msgstr "" msgstr "你確定要離開群組 \"${this.group.fullName}\" 嗎?"
msgid "GroupsTree|Create a project in this group." msgid "GroupsTree|Create a project in this group."
msgstr "" msgstr "在此群組建立新的專案"
msgid "GroupsTree|Create a subgroup in this group." msgid "GroupsTree|Create a subgroup in this group."
msgstr "" msgstr "在此群組中建立子群組"
msgid "GroupsTree|Edit group" msgid "GroupsTree|Edit group"
msgstr "" msgstr "編輯群組"
msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner." msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
msgstr "" msgstr "無法離開群組,請確保您不是唯一的擁有者。"
msgid "GroupsTree|Filter by name..." msgid "GroupsTree|Filter by name..."
msgstr "" msgstr "以名稱篩選⋯"
msgid "GroupsTree|Leave this group" msgid "GroupsTree|Leave this group"
msgstr "" msgstr "離開此群組"
msgid "GroupsTree|Loading groups" msgid "GroupsTree|Loading groups"
msgstr "" msgstr "群組讀取中"
msgid "GroupsTree|Sorry, no groups matched your search" msgid "GroupsTree|Sorry, no groups matched your search"
msgstr "" msgstr "不好意思,沒有搜尋到任何符合條件的群組"
msgid "GroupsTree|Sorry, no groups or projects matched your search" msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr "" msgstr "不好意思,沒有搜尋到任何符合條件的群組或專案"
msgid "Health Check" msgid "Health Check"
msgstr "健康檢查" msgstr "健康檢查"
...@@ -1081,10 +1081,10 @@ msgid "Import repository" ...@@ -1081,10 +1081,10 @@ msgid "Import repository"
msgstr "匯入檔案庫 (repository)" msgstr "匯入檔案庫 (repository)"
msgid "Improve Issue boards with GitLab Enterprise Edition." msgid "Improve Issue boards with GitLab Enterprise Edition."
msgstr "協助改進 GitLab 企業版的問題看板。" msgstr "協助改進 GitLab 企業版的議題看板(issue boards)"
msgid "Improve issues management with Issue weight and GitLab Enterprise Edition." msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
msgstr "協助改善 GitLab 企業版的問題管理與權重。" msgstr "協助改進 GitLab 企業版的議題管理與權重。"
msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition." msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
msgstr "協助改進 GitLab 企業版的搜尋 & 進階全局搜尋。" msgstr "協助改進 GitLab 企業版的搜尋 & 進階全局搜尋。"
...@@ -1094,13 +1094,13 @@ msgstr "安裝與 GitLab CI 相容的 Runner" ...@@ -1094,13 +1094,13 @@ msgstr "安裝與 GitLab CI 相容的 Runner"
msgid "Instance" msgid "Instance"
msgid_plural "Instances" msgid_plural "Instances"
msgstr[0] "實例" msgstr[0] "主機"
msgid "Internal - The group and any internal projects can be viewed by any logged in user." msgid "Internal - The group and any internal projects can be viewed by any logged in user."
msgstr "" msgstr "內部 - 任何登入的使用者都可以查看該群組及其專案"
msgid "Internal - The project can be accessed by any logged in user." msgid "Internal - The project can be accessed by any logged in user."
msgstr "" msgstr "內部 - 任何登入的使用者都可以存取此專案"
msgid "Interval Pattern" msgid "Interval Pattern"
msgstr "循環週期" msgstr "循環週期"
...@@ -1109,10 +1109,10 @@ msgid "Introducing Cycle Analytics" ...@@ -1109,10 +1109,10 @@ msgid "Introducing Cycle Analytics"
msgstr "週期分析簡介" msgstr "週期分析簡介"
msgid "Issue board focus mode" msgid "Issue board focus mode"
msgstr "問題看板模式" msgstr "議題看板(issue boards)模式"
msgid "Issue boards with milestones" msgid "Issue boards with milestones"
msgstr "問題看板 & 里程碑" msgstr "議題看板(issue boards)與里程碑"
msgid "Issue events" msgid "Issue events"
msgstr "議題 (issue) 事件" msgstr "議題 (issue) 事件"
...@@ -1146,10 +1146,10 @@ msgid "Last commit" ...@@ -1146,10 +1146,10 @@ msgid "Last commit"
msgstr "最後更動記錄 (commit) " msgstr "最後更動記錄 (commit) "
msgid "Last edited %{date}" msgid "Last edited %{date}"
msgstr "上次編輯於 %{date}" msgstr "最後編輯於 %{date}"
msgid "Last edited by %{name}" msgid "Last edited by %{name}"
msgstr "上次編輯由 %{name}" msgstr "最後由 %{name} 編輯"
msgid "Last update" msgid "Last update"
msgstr "上次更新" msgstr "上次更新"
...@@ -1170,7 +1170,7 @@ msgid "Learn more in the|pipeline schedules documentation" ...@@ -1170,7 +1170,7 @@ msgid "Learn more in the|pipeline schedules documentation"
msgstr "流水線 (pipeline) 排程說明文件" msgstr "流水線 (pipeline) 排程說明文件"
msgid "Leave" msgid "Leave"
msgstr "" msgstr "離開"
msgid "Leave group" msgid "Leave group"
msgstr "退出群組" msgstr "退出群組"
...@@ -1192,13 +1192,13 @@ msgid "Locked" ...@@ -1192,13 +1192,13 @@ msgid "Locked"
msgstr "鎖定" msgstr "鎖定"
msgid "Locked Files" msgid "Locked Files"
msgstr "被鎖定檔案" msgstr "被鎖定檔案"
msgid "Login" msgid "Login"
msgstr "" msgstr "登入"
msgid "Maximum git storage failures" msgid "Maximum git storage failures"
msgstr "" msgstr "最大 git 儲存失敗"
msgid "Median" msgid "Median"
msgstr "中位數" msgstr "中位數"
...@@ -1228,10 +1228,10 @@ msgid "More information is available|here" ...@@ -1228,10 +1228,10 @@ msgid "More information is available|here"
msgstr "健康檢查" msgstr "健康檢查"
msgid "Multiple issue boards" msgid "Multiple issue boards"
msgstr "多個問題看板" msgstr "多個議題看板 (issue boards)"
msgid "New Cluster" msgid "New Cluster"
msgstr "" msgstr "新叢集"
msgid "New Issue" msgid "New Issue"
msgid_plural "New Issues" msgid_plural "New Issues"
...@@ -1250,7 +1250,7 @@ msgid "New file" ...@@ -1250,7 +1250,7 @@ msgid "New file"
msgstr "新增檔案" msgstr "新增檔案"
msgid "New group" msgid "New group"
msgstr "" msgstr "新群組"
msgid "New issue" msgid "New issue"
msgstr "新增議題 (issue) " msgstr "新增議題 (issue) "
...@@ -1259,7 +1259,7 @@ msgid "New merge request" ...@@ -1259,7 +1259,7 @@ msgid "New merge request"
msgstr "新增合併請求 (merge request) " msgstr "新增合併請求 (merge request) "
msgid "New project" msgid "New project"
msgstr "" msgstr "新專案"
msgid "New schedule" msgid "New schedule"
msgstr "新增排程" msgstr "新增排程"
...@@ -1268,7 +1268,7 @@ msgid "New snippet" ...@@ -1268,7 +1268,7 @@ msgid "New snippet"
msgstr "新文字片段" msgstr "新文字片段"
msgid "New subgroup" msgid "New subgroup"
msgstr "" msgstr "新子群組"
msgid "New tag" msgid "New tag"
msgstr "新增標籤" msgstr "新增標籤"
...@@ -1349,7 +1349,7 @@ msgid "Notifications" ...@@ -1349,7 +1349,7 @@ msgid "Notifications"
msgstr "通知" msgstr "通知"
msgid "Number of access attempts" msgid "Number of access attempts"
msgstr "" msgstr "嘗試存取的次數"
msgid "Number of failures before backing off" msgid "Number of failures before backing off"
msgstr "" msgstr ""
...@@ -1376,7 +1376,7 @@ msgid "Owner" ...@@ -1376,7 +1376,7 @@ msgid "Owner"
msgstr "所有權" msgstr "所有權"
msgid "Pagination|Last »" msgid "Pagination|Last »"
msgstr "頁 »" msgstr "最末頁 »"
msgid "Pagination|Next" msgid "Pagination|Next"
msgstr "下一頁" msgstr "下一頁"
...@@ -1385,13 +1385,13 @@ msgid "Pagination|Prev" ...@@ -1385,13 +1385,13 @@ msgid "Pagination|Prev"
msgstr "上一頁" msgstr "上一頁"
msgid "Pagination|« First" msgid "Pagination|« First"
msgstr "« 頁" msgstr "« 第一頁"
msgid "Password" msgid "Password"
msgstr "密碼" msgstr "密碼"
msgid "People without permission will never get a notification and won\\'t be able to comment." msgid "People without permission will never get a notification and won\\'t be able to comment."
msgstr "當使用者沒有權限,將不會收到任何通知以及無法留言" msgstr "沒有權限的使用者將不會收到通知,也無法留言。"
msgid "Pipeline" msgid "Pipeline"
msgstr "流水線 (pipeline) " msgstr "流水線 (pipeline) "
...@@ -1406,7 +1406,7 @@ msgid "Pipeline Schedules" ...@@ -1406,7 +1406,7 @@ msgid "Pipeline Schedules"
msgstr "流水線 (pipeline) 排程" msgstr "流水線 (pipeline) 排程"
msgid "Pipeline quota" msgid "Pipeline quota"
msgstr "流水線配額" msgstr "流水線額度"
msgid "PipelineCharts|Failed:" msgid "PipelineCharts|Failed:"
msgstr "失敗:" msgstr "失敗:"
...@@ -1496,52 +1496,52 @@ msgid "Preferences" ...@@ -1496,52 +1496,52 @@ msgid "Preferences"
msgstr "偏好設定" msgstr "偏好設定"
msgid "Private - Project access must be granted explicitly to each user." msgid "Private - Project access must be granted explicitly to each user."
msgstr "" msgstr "私有 - 專案權限必須一一指派給每個使用者"
msgid "Private - The group and its projects can only be viewed by members." msgid "Private - The group and its projects can only be viewed by members."
msgstr "" msgstr "私有 - 群組及旗下專案只能被該群組成員查看"
msgid "Profile" msgid "Profile"
msgstr "個人資料" msgstr "個人資料"
msgid "Profiles|Account scheduled for removal." msgid "Profiles|Account scheduled for removal."
msgstr "" msgstr "帳號將會被刪除"
msgid "Profiles|Delete Account" msgid "Profiles|Delete Account"
msgstr "" msgstr "刪除帳號"
msgid "Profiles|Delete account" msgid "Profiles|Delete account"
msgstr "" msgstr "刪除帳號"
msgid "Profiles|Delete your account?" msgid "Profiles|Delete your account?"
msgstr "" msgstr "刪除您的帳號?"
msgid "Profiles|Deleting an account has the following effects:" msgid "Profiles|Deleting an account has the following effects:"
msgstr "" msgstr "刪除帳號將會造成以下影響:"
msgid "Profiles|Invalid password" msgid "Profiles|Invalid password"
msgstr "" msgstr "無效的密碼"
msgid "Profiles|Invalid username" msgid "Profiles|Invalid username"
msgstr "" msgstr "無效的使用者名稱"
msgid "Profiles|Type your %{confirmationValue} to confirm:" msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "" msgstr "輸入您的 %{confirmationValue} 以確認:"
msgid "Profiles|You don't have access to delete this user." msgid "Profiles|You don't have access to delete this user."
msgstr "" msgstr "您沒有權限刪除此帳號"
msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account." msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
msgstr "" msgstr "你必須轉換你的所有權或在你刪除你帳號前刪除這些群組"
msgid "Profiles|Your account is currently an owner in these groups:" msgid "Profiles|Your account is currently an owner in these groups:"
msgstr "" msgstr "你的帳號目前擁有這些群組:"
msgid "Profiles|your account" msgid "Profiles|your account"
msgstr "" msgstr "你的帳號"
msgid "Project '%{project_name}' is in the process of being deleted." msgid "Project '%{project_name}' is in the process of being deleted."
msgstr "" msgstr "專案 \"%{project_name}\" 正在被刪除。"
msgid "Project '%{project_name}' queued for deletion." msgid "Project '%{project_name}' queued for deletion."
msgstr "專案 '%{project_name}' 已加入刪除佇列。" msgstr "專案 '%{project_name}' 已加入刪除佇列。"
...@@ -1598,22 +1598,22 @@ msgid "ProjectSettings|Contact an admin to change this setting." ...@@ -1598,22 +1598,22 @@ msgid "ProjectSettings|Contact an admin to change this setting."
msgstr "聯絡管理員以變更設定。" msgstr "聯絡管理員以變更設定。"
msgid "ProjectSettings|Only signed commits can be pushed to this repository." msgid "ProjectSettings|Only signed commits can be pushed to this repository."
msgstr "只有已簽署的變更才能被推送到倉庫。" msgstr "只有已簽章的變更才能被推送到檔案庫(repository)。"
msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin." msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
msgstr "此設定已經套用於伺服器層級,並且可被管理員覆寫。" msgstr "此設定已經套用於伺服器層級,並且可被管理員覆寫。"
msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project." msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
msgstr "此設定已經套用於伺服器級別,但已經在這個專案被覆寫。" msgstr "此設定已經套用至伺服器層級,但此專案使用另一個設定。"
msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin." msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
msgstr "此設定將套用所有專案,除非被管理員覆寫。" msgstr "此設定將套用所有專案,除非被管理員覆寫。"
msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails." msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
msgstr "" msgstr "使用者推送的修改 (commits) 只能使用他們自己的電子郵件。"
msgid "Projects" msgid "Projects"
msgstr "" msgstr "專案"
msgid "ProjectsDropdown|Frequently visited" msgid "ProjectsDropdown|Frequently visited"
msgstr "經常使用" msgstr "經常使用"
...@@ -1637,10 +1637,10 @@ msgid "ProjectsDropdown|This feature requires browser localStorage support" ...@@ -1637,10 +1637,10 @@ msgid "ProjectsDropdown|This feature requires browser localStorage support"
msgstr "此功能需要瀏覽器支援 localStorage" msgstr "此功能需要瀏覽器支援 localStorage"
msgid "Public - The group and any public projects can be viewed without any authentication." msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr "" msgstr "公開 - 未登入的情況下依然可以查看任何公開專案"
msgid "Public - The project can be accessed without any authentication." msgid "Public - The project can be accessed without any authentication."
msgstr "" msgstr "公開 - 無須任何身份驗證即可存取該專案"
msgid "Push Rules" msgid "Push Rules"
msgstr "推送 [Push] 規則" msgstr "推送 [Push] 規則"
...@@ -1649,7 +1649,7 @@ msgid "Push events" ...@@ -1649,7 +1649,7 @@ msgid "Push events"
msgstr "推送 (push) 事件" msgstr "推送 (push) 事件"
msgid "PushRule|Committer restriction" msgid "PushRule|Committer restriction"
msgstr "" msgstr "提交限制"
msgid "Read more" msgid "Read more"
msgstr "瞭解更多" msgstr "瞭解更多"
...@@ -1715,7 +1715,7 @@ msgid "SSH Keys" ...@@ -1715,7 +1715,7 @@ msgid "SSH Keys"
msgstr "SSH 金鑰" msgstr "SSH 金鑰"
msgid "Save" msgid "Save"
msgstr "" msgstr "儲存"
msgid "Save changes" msgid "Save changes"
msgstr "儲存變更" msgstr "儲存變更"
...@@ -1736,13 +1736,13 @@ msgid "Search branches and tags" ...@@ -1736,13 +1736,13 @@ msgid "Search branches and tags"
msgstr "搜尋分支 (branch) 和標籤" msgstr "搜尋分支 (branch) 和標籤"
msgid "Seconds before reseting failure information" msgid "Seconds before reseting failure information"
msgstr "" msgstr "重置失敗訊息等待時間(秒)"
msgid "Seconds to wait after a storage failure" msgid "Seconds to wait after a storage failure"
msgstr "" msgstr "儲存失敗後等待時間(秒)"
msgid "Seconds to wait for a storage access attempt" msgid "Seconds to wait for a storage access attempt"
msgstr "" msgstr "等待存取儲存空間的嘗試時間(秒)"
msgid "Select Archive Format" msgid "Select Archive Format"
msgstr "選擇下載格式" msgstr "選擇下載格式"
...@@ -1775,7 +1775,7 @@ msgid "Settings" ...@@ -1775,7 +1775,7 @@ msgid "Settings"
msgstr "設定" msgstr "設定"
msgid "Show parent pages" msgid "Show parent pages"
msgstr "顯示頁面" msgstr "顯示上層頁面"
msgid "Show parent subgroups" msgid "Show parent subgroups"
msgstr "顯示群組中的子群組" msgstr "顯示群組中的子群組"
...@@ -1788,25 +1788,25 @@ msgid "Snippets" ...@@ -1788,25 +1788,25 @@ msgid "Snippets"
msgstr "文字片段" msgstr "文字片段"
msgid "Something went wrong on our end." msgid "Something went wrong on our end."
msgstr "" msgstr "發生了錯誤。"
msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}" msgid "Something went wrong trying to change the locked state of this ${this.issuableDisplayName(this.issuableType)}"
msgstr "有個地方出錯了,因為他嘗試去變更 ${this.issuableDisplayName(this.issuableType)} 的鎖定狀態。" msgstr "有個地方出錯了,因為他嘗試去變更 ${this.issuableDisplayName(this.issuableType)} 的鎖定狀態。"
msgid "Something went wrong while fetching the projects." msgid "Something went wrong while fetching the projects."
msgstr "" msgstr "讀取專案時發生錯誤。"
msgid "Something went wrong while fetching the registry list." msgid "Something went wrong while fetching the registry list."
msgstr "" msgstr "讀取註冊列表時發生錯誤。"
msgid "Sort by" msgid "Sort by"
msgstr "" msgstr "排序"
msgid "SortOptions|Access level, ascending" msgid "SortOptions|Access level, ascending"
msgstr "訪問級別、升冪排列" msgstr "存取層級,以升冪排列"
msgid "SortOptions|Access level, descending" msgid "SortOptions|Access level, descending"
msgstr "訪問級別、降冪排列" msgstr ""
msgid "SortOptions|Created date" msgid "SortOptions|Created date"
msgstr "建立日期" msgstr "建立日期"
...@@ -1827,7 +1827,7 @@ msgid "SortOptions|Largest group" ...@@ -1827,7 +1827,7 @@ msgid "SortOptions|Largest group"
msgstr "最大群組" msgstr "最大群組"
msgid "SortOptions|Largest repository" msgid "SortOptions|Largest repository"
msgstr "最大儲存庫" msgstr "最大檔案庫(repository)"
msgid "SortOptions|Last created" msgid "SortOptions|Last created"
msgstr "最近建立" msgstr "最近建立"
...@@ -1920,10 +1920,10 @@ msgid "Start the Runner!" ...@@ -1920,10 +1920,10 @@ msgid "Start the Runner!"
msgstr "啟動 Runner!" msgstr "啟動 Runner!"
msgid "Subgroups" msgid "Subgroups"
msgstr "" msgstr "子群組"
msgid "Subscribe" msgid "Subscribe"
msgstr "" msgstr "訂閱"
msgid "Switch branch/tag" msgid "Switch branch/tag"
msgstr "切換分支 (branch) 或標籤" msgstr "切換分支 (branch) 或標籤"
...@@ -1951,7 +1951,7 @@ msgid "The Advanced Global Search in GitLab is a powerful search service that sa ...@@ -1951,7 +1951,7 @@ msgid "The Advanced Global Search in GitLab is a powerful search service that sa
msgstr "GitLab 的進階全局搜尋功能是非常強大的搜尋服務。您可以搜尋其他團隊的代碼以幫助您完善自己項目中的代碼。從而避免建立重複的代碼浪費時間。" msgstr "GitLab 的進階全局搜尋功能是非常強大的搜尋服務。您可以搜尋其他團隊的代碼以幫助您完善自己項目中的代碼。從而避免建立重複的代碼浪費時間。"
msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold" msgid "The circuitbreaker backoff threshold should be lower than the failure count threshold"
msgstr "" msgstr "限流阻斷元件的觸發門檻應低於計數錯誤門檻"
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request." msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "程式開發階段顯示從第一次更動記錄 (commit) 到建立合併請求 (merge request) 的時間。建立第一個合併請求後,資料將自動填入。" msgstr "程式開發階段顯示從第一次更動記錄 (commit) 到建立合併請求 (merge request) 的時間。建立第一個合併請求後,資料將自動填入。"
...@@ -1966,13 +1966,13 @@ msgid "The issue stage shows the time it takes from creating an issue to assigni ...@@ -1966,13 +1966,13 @@ msgid "The issue stage shows the time it takes from creating an issue to assigni
msgstr "議題 (issue) 階段顯示從議題建立到設定里程碑所花的時間,或是議題被分類到議題看板 (issue board) 中所花的時間。建立第一個議題後,資料將自動填入。" msgstr "議題 (issue) 階段顯示從議題建立到設定里程碑所花的時間,或是議題被分類到議題看板 (issue board) 中所花的時間。建立第一個議題後,資料將自動填入。"
msgid "The number of attempts GitLab will make to access a storage." msgid "The number of attempts GitLab will make to access a storage."
msgstr "" msgstr "GitLab 存取儲存空間的嘗試次數。"
msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host" msgid "The number of failures after which GitLab will start temporarily disabling access to a storage shard on a host"
msgstr "" msgstr ""
msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}." msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
msgstr "" msgstr "GitLab 將阻擋存取失敗的次數。在管理者介面中可以重置失敗次數: %{link_to_health_page} 或使用 %{api_documentation_link}。"
msgid "The phase of the development lifecycle." msgid "The phase of the development lifecycle."
msgstr "專案開發週期的各個階段。" msgstr "專案開發週期的各個階段。"
...@@ -2005,10 +2005,10 @@ msgid "The testing stage shows the time GitLab CI takes to run every pipeline fo ...@@ -2005,10 +2005,10 @@ msgid "The testing stage shows the time GitLab CI takes to run every pipeline fo
msgstr "測試階段顯示相關合併請求 (merge request) 的流水線 (pipeline) 所花的時間。當第一個流水線 (pipeline) 執行完畢後,資料將自動填入。" msgstr "測試階段顯示相關合併請求 (merge request) 的流水線 (pipeline) 所花的時間。當第一個流水線 (pipeline) 執行完畢後,資料將自動填入。"
msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset." msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
msgstr "" msgstr "GitLab 保存失敗訊息的時間(秒)。在此時間內若沒有發生錯誤,失敗訊息將會被重置"
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised." msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr "" msgstr "GitLab 嘗試存取檔案庫 (repository) 的時間 (秒)。超過此時間將會引發逾時錯誤。"
msgid "The time taken by each data entry gathered by that stage." msgid "The time taken by each data entry gathered by that stage."
msgstr "該階段中每一個資料項目所花的時間。" msgstr "該階段中每一個資料項目所花的時間。"
...@@ -2020,7 +2020,7 @@ msgid "There are problems accessing Git storage: " ...@@ -2020,7 +2020,7 @@ msgid "There are problems accessing Git storage: "
msgstr "存取 Git 儲存空間時出現問題:" msgstr "存取 Git 儲存空間時出現問題:"
msgid "This branch has changed since you started editing. Would you like to create a new branch?" msgid "This branch has changed since you started editing. Would you like to create a new branch?"
msgstr "" msgstr "在您編輯後,此分支已被更改,您想要建立一個新的分支嗎?"
msgid "This is a confidential issue." msgid "This is a confidential issue."
msgstr "這是個隱密問題。" msgstr "這是個隱密問題。"
...@@ -2205,7 +2205,7 @@ msgid "Unstar" ...@@ -2205,7 +2205,7 @@ msgid "Unstar"
msgstr "取消收藏" msgstr "取消收藏"
msgid "Unsubscribe" msgid "Unsubscribe"
msgstr "" msgstr "取消訂閱"
msgid "Upgrade your plan to activate Advanced Global Search." msgid "Upgrade your plan to activate Advanced Global Search."
msgstr "升級您的方案以啟用進階全局搜尋。" msgstr "升級您的方案以啟用進階全局搜尋。"
...@@ -2220,7 +2220,7 @@ msgid "Upgrade your plan to activate Issue weight." ...@@ -2220,7 +2220,7 @@ msgid "Upgrade your plan to activate Issue weight."
msgstr "升級您的方案以啟用問題權重。" msgstr "升級您的方案以啟用問題權重。"
msgid "Upgrade your plan to improve Issue boards." msgid "Upgrade your plan to improve Issue boards."
msgstr "升級您的方案以使用問題看版" msgstr "升級您的方案以使用議題看板(issue boards)"
msgid "Upload New File" msgid "Upload New File"
msgstr "上傳新檔案" msgstr "上傳新檔案"
...@@ -2265,19 +2265,19 @@ msgid "We don't have enough data to show this stage." ...@@ -2265,19 +2265,19 @@ msgid "We don't have enough data to show this stage."
msgstr "因該階段的資料不足而無法顯示相關資訊" msgstr "因該階段的資料不足而無法顯示相關資訊"
msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group." msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
msgstr "如果有新的推送或新的议题,Webhook 将自动触发您设置 URL。 您可以配置 Webhook 来监听特定事件,如推送、议题或合并请求。 群组 Webhook 将适用于团队中的所有项目,并允许您设置整个团队中的 Webhook 。" msgstr ""
msgid "Weight" msgid "Weight"
msgstr "權重" msgstr "權重"
msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable" msgid "When access to a storage fails. GitLab will prevent access to the storage for the time specified here. This allows the filesystem to recover. Repositories on failing shards are temporarly unavailable"
msgstr "" msgstr "當存取檔案庫 (repository) 失敗時, GitLab 將在此處指定的時間內防止檔案庫的存取,以此等待檔案系統恢復。失敗的檔案庫分流 (shard) 會暫時無法使用。"
msgid "Wiki" msgid "Wiki"
msgstr "Wiki" msgstr "Wiki"
msgid "WikiClone|Clone your wiki" msgid "WikiClone|Clone your wiki"
msgstr "克隆你的維基" msgstr "複製(clone)您的 Wiki"
msgid "WikiClone|Git Access" msgid "WikiClone|Git Access"
msgstr "Git 讀取" msgstr "Git 讀取"
...@@ -2292,10 +2292,10 @@ msgid "WikiClone|Start Gollum and edit locally" ...@@ -2292,10 +2292,10 @@ msgid "WikiClone|Start Gollum and edit locally"
msgstr "開始你的 Gollum 並在本機編輯。" msgstr "開始你的 Gollum 並在本機編輯。"
msgid "WikiEmptyPageError|You are not allowed to create wiki pages" msgid "WikiEmptyPageError|You are not allowed to create wiki pages"
msgstr "你沒有權限去建立維基頁面" msgstr "你沒有權限建立 Wiki 頁面"
msgid "WikiHistoricalPage|This is an old version of this page." msgid "WikiHistoricalPage|This is an old version of this page."
msgstr "這是這個頁面較舊的版本。" msgstr "這個頁面較舊的版本。"
msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}." msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}."
msgstr "你可以查看 %{most_recent_link} 或是瀏覽 %{history_link} 。" msgstr "你可以查看 %{most_recent_link} 或是瀏覽 %{history_link} 。"
...@@ -2343,7 +2343,7 @@ msgid "WikiPage|Page slug" ...@@ -2343,7 +2343,7 @@ msgid "WikiPage|Page slug"
msgstr "頁面 slug" msgstr "頁面 slug"
msgid "WikiPage|Write your content or drag files here..." msgid "WikiPage|Write your content or drag files here..."
msgstr "寫上你的內容或拖曳檔案到這..." msgstr "填寫內容或拖曳檔案至此..."
msgid "Wiki|Create Page" msgid "Wiki|Create Page"
msgstr "建立頁面" msgstr "建立頁面"
...@@ -2394,19 +2394,19 @@ msgid "You are going to transfer %{project_name_with_namespace} to another owner ...@@ -2394,19 +2394,19 @@ msgid "You are going to transfer %{project_name_with_namespace} to another owner
msgstr "將要把 %{project_name_with_namespace} 的所有權轉移給另一個人。真的「確定」要這麼做嗎?" msgstr "將要把 %{project_name_with_namespace} 的所有權轉移給另一個人。真的「確定」要這麼做嗎?"
msgid "You are on a read-only GitLab instance." msgid "You are on a read-only GitLab instance."
msgstr "" msgstr "您在唯讀的 GitLab 主機上。"
msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}." msgid "You are on a read-only GitLab instance. If you want to make any changes, you must visit the %{link_to_primary_node}."
msgstr "" msgstr "您在唯讀的 GitLab 主機上,如果您想要進行修改,必須到 %{link_to_primary_node}"
msgid "You can only add files when you are on a branch" msgid "You can only add files when you are on a branch"
msgstr "只能在分支 (branch) 上建立檔案" msgstr "只能在分支 (branch) 上建立檔案"
msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead." msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
msgstr "" msgstr "您不能寫入唯讀的次要 GitLab Geo 主機。請改用 %{link_to_primary_node}。"
msgid "You cannot write to this read-only GitLab instance." msgid "You cannot write to this read-only GitLab instance."
msgstr "" msgstr "您不能修改這個唯讀的 GitLab 主機。"
msgid "You have reached your project limit" msgid "You have reached your project limit"
msgstr "您已達到專案數量限制" msgstr "您已達到專案數量限制"
...@@ -2442,7 +2442,7 @@ msgid "Your comment will not be visible to the public." ...@@ -2442,7 +2442,7 @@ msgid "Your comment will not be visible to the public."
msgstr "你的留言將不會被公開。" msgstr "你的留言將不會被公開。"
msgid "Your groups" msgid "Your groups"
msgstr "" msgstr "您的群組"
msgid "Your name" msgid "Your name"
msgstr "您的名字" msgstr "您的名字"
...@@ -2468,14 +2468,14 @@ msgid_plural "parents" ...@@ -2468,14 +2468,14 @@ msgid_plural "parents"
msgstr[0] "上層" msgstr[0] "上層"
msgid "password" msgid "password"
msgstr "" msgstr "密碼"
msgid "personal access token" msgid "personal access token"
msgstr "" msgstr "私人存取憑證 (access token)"
msgid "to help your contributors communicate effectively!" msgid "to help your contributors communicate effectively!"
msgstr "幫助你的貢獻者進行有效的溝通!" msgstr "幫助你的貢獻者進行有效的溝通!"
msgid "username" msgid "username"
msgstr "" msgstr "使用者名稱"
...@@ -130,11 +130,35 @@ describe Projects::BranchesController do ...@@ -130,11 +130,35 @@ describe Projects::BranchesController do
expect(response).to have_gitlab_http_status(302) expect(response).to have_gitlab_http_status(302)
end end
end end
<<<<<<< HEAD
context 'when user configured kubernetes from Integration > Kubernetes' do context 'when user configured kubernetes from Integration > Kubernetes' do
before do before do
project.services << build(:kubernetes_service) project.services << build(:kubernetes_service)
end end
=======
context 'when user configured kubernetes from Integration > Kubernetes' do
before do
project.services << build(:kubernetes_service)
end
it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
end
context 'when user configured kubernetes from CI/CD > Clusters' do
before do
create(:cluster, :provided_by_gcp, projects: [project])
end
it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
end
it 'redirects to autodeploy setup page' do
result = { status: :success, branch: double(name: branch) }
create(:cluster, :provided_by_gcp, projects: [project])
>>>>>>> origin/master
it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes' it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
end end
......
...@@ -34,7 +34,7 @@ describe Projects::EnvironmentsController do ...@@ -34,7 +34,7 @@ describe Projects::EnvironmentsController do
context 'when requesting JSON response for folders' do context 'when requesting JSON response for folders' do
before do before do
allow_any_instance_of(Environment).to receive(:deployment_service_ready?).and_return(true) allow_any_instance_of(Environment).to receive(:has_terminals?).and_return(true)
allow_any_instance_of(Environment).to receive(:rollout_status).and_return(kube_deployment_rollout_status) allow_any_instance_of(Environment).to receive(:rollout_status).and_return(kube_deployment_rollout_status)
create(:environment, project: project, create(:environment, project: project,
......
...@@ -43,6 +43,17 @@ describe 'Epic Issues', :js do ...@@ -43,6 +43,17 @@ describe 'Epic Issues', :js do
end end
context 'when user is a group member' do context 'when user is a group member' do
let(:issue_to_add) { create(:issue, project: private_project) }
let(:issue_invalid) { create(:issue) }
def add_issues(references)
find('.related-issues-block h3.panel-title button').click
find('.js-add-issuable-form-input').set(references)
find('.js-add-issuable-form-add-button').click
wait_for_requests
end
before do before do
group.add_developer(user) group.add_developer(user)
visit_epic visit_epic
...@@ -64,16 +75,20 @@ describe 'Epic Issues', :js do ...@@ -64,16 +75,20 @@ describe 'Epic Issues', :js do
end end
end end
it 'user cannot add new issues to the epic from another group' do
add_issues("#{issue_invalid.to_reference(full: true)}")
expect(page).to have_selector('.content-wrapper .alert-wrapper .flash-text')
expect(find('.flash-alert')).to have_text('No Issue found for given params')
end
it 'user can add new issues to the epic' do it 'user can add new issues to the epic' do
issue_to_add = create(:issue, project: private_project)
issue_invalid = create(:issue)
references = "#{issue_to_add.to_reference(full: true)} #{issue_invalid.to_reference(full: true)}" references = "#{issue_to_add.to_reference(full: true)} #{issue_invalid.to_reference(full: true)}"
find('.related-issues-block h3.panel-title button').click add_issues(references)
find('.js-add-issuable-form-input').set references
find('.js-add-issuable-form-add-button').click
wait_for_requests expect(page).not_to have_selector('.content-wrapper .alert-wrapper .flash-text')
expect(page).not_to have_content('No Issue found for given params')
within('.related-issues-block ul.issuable-list') do within('.related-issues-block ul.issuable-list') do
expect(page).to have_selector('li', count: 3) expect(page).to have_selector('li', count: 3)
......
...@@ -4,51 +4,65 @@ describe KubernetesService, models: true, use_clean_rails_memory_store_caching: ...@@ -4,51 +4,65 @@ describe KubernetesService, models: true, use_clean_rails_memory_store_caching:
include KubernetesHelpers include KubernetesHelpers
include ReactiveCachingHelpers include ReactiveCachingHelpers
let(:project) { build_stubbed(:kubernetes_project) } shared_examples 'same behavior between KubernetesService and Platform::Kubernetes' do
let(:service) { project.kubernetes_service } let(:service) { project.deployment_platform }
describe '#rollout_status' do describe '#rollout_status' do
let(:environment) { build(:environment, project: project, name: "env", slug: "env-000000") } let(:environment) { build(:environment, project: project, name: "env", slug: "env-000000") }
subject(:rollout_status) { service.rollout_status(environment) } subject(:rollout_status) { service.rollout_status(environment) }
context 'with valid deployments' do context 'with valid deployments' do
before do before do
stub_reactive_cache( stub_reactive_cache(
service, service,
deployments: [kube_deployment(app: environment.slug), kube_deployment] deployments: [kube_deployment(app: environment.slug), kube_deployment]
) )
end end
it 'creates a matching RolloutStatus' do it 'creates a matching RolloutStatus' do
expect(rollout_status).to be_kind_of(::Gitlab::Kubernetes::RolloutStatus) expect(rollout_status).to be_kind_of(::Gitlab::Kubernetes::RolloutStatus)
expect(rollout_status.deployments.map(&:labels)).to eq([{ 'app' => 'env-000000' }]) expect(rollout_status.deployments.map(&:labels)).to eq([{ 'app' => 'env-000000' }])
end
end end
end
context 'with empty list of deployments' do context 'with empty list of deployments' do
before do before do
stub_reactive_cache( stub_reactive_cache(
service, service,
deployments: [] deployments: []
) )
end end
it 'creates a matching RolloutStatus' do it 'creates a matching RolloutStatus' do
expect(rollout_status).to be_kind_of(::Gitlab::Kubernetes::RolloutStatus) expect(rollout_status).to be_kind_of(::Gitlab::Kubernetes::RolloutStatus)
expect(rollout_status).to be_not_found expect(rollout_status).to be_not_found
end
end end
end
context 'not yet loaded deployments' do context 'not yet loaded deployments' do
before do before do
stub_reactive_cache stub_reactive_cache
end end
it 'creates a matching RolloutStatus' do it 'creates a matching RolloutStatus' do
expect(rollout_status).to be_kind_of(::Gitlab::Kubernetes::RolloutStatus) expect(rollout_status).to be_kind_of(::Gitlab::Kubernetes::RolloutStatus)
expect(rollout_status).to be_loading expect(rollout_status).to be_loading
end
end end
end end
end end
context 'when user configured kubernetes from Integration > Kubernetes' do
let(:project) { create(:kubernetes_project) }
it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
end
context 'when user configured kubernetes from CI/CD > Clusters' do
let!(:cluster) { create(:cluster, :project, :provided_by_gcp) }
let(:project) { cluster.project }
it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
end
end end
...@@ -2,7 +2,7 @@ import Vue from 'vue'; ...@@ -2,7 +2,7 @@ import Vue from 'vue';
import Autosize from 'autosize'; import Autosize from 'autosize';
import store from '~/notes/stores'; import store from '~/notes/stores';
import issueCommentForm from '~/notes/components/issue_comment_form.vue'; import issueCommentForm from '~/notes/components/issue_comment_form.vue';
import { loggedOutIssueData, notesDataMock, userDataMock, issueDataMock } from '../mock_data'; import { loggedOutIssueData, notesDataMock, userDataMock, noteableDataMock } from '../mock_data';
import { keyboardDownEvent } from '../../issue_show/helpers'; import { keyboardDownEvent } from '../../issue_show/helpers';
describe('issue_comment_form component', () => { describe('issue_comment_form component', () => {
...@@ -23,7 +23,7 @@ describe('issue_comment_form component', () => { ...@@ -23,7 +23,7 @@ describe('issue_comment_form component', () => {
describe('user is logged in', () => { describe('user is logged in', () => {
beforeEach(() => { beforeEach(() => {
store.dispatch('setUserData', userDataMock); store.dispatch('setUserData', userDataMock);
store.dispatch('setIssueData', issueDataMock); store.dispatch('setNoteableData', noteableDataMock);
store.dispatch('setNotesData', notesDataMock); store.dispatch('setNotesData', notesDataMock);
vm = mountComponent(); vm = mountComponent();
...@@ -178,7 +178,7 @@ describe('issue_comment_form component', () => { ...@@ -178,7 +178,7 @@ describe('issue_comment_form component', () => {
describe('issue is confidential', () => { describe('issue is confidential', () => {
it('shows information warning', (done) => { it('shows information warning', (done) => {
store.dispatch('setIssueData', Object.assign(issueDataMock, { confidential: true })); store.dispatch('setNoteableData', Object.assign(noteableDataMock, { confidential: true }));
Vue.nextTick(() => { Vue.nextTick(() => {
expect(vm.$el.querySelector('.confidential-issue-warning')).toBeDefined(); expect(vm.$el.querySelector('.confidential-issue-warning')).toBeDefined();
done(); done();
...@@ -190,7 +190,7 @@ describe('issue_comment_form component', () => { ...@@ -190,7 +190,7 @@ describe('issue_comment_form component', () => {
describe('user is not logged in', () => { describe('user is not logged in', () => {
beforeEach(() => { beforeEach(() => {
store.dispatch('setUserData', null); store.dispatch('setUserData', null);
store.dispatch('setIssueData', loggedOutIssueData); store.dispatch('setNoteableData', loggedOutIssueData);
store.dispatch('setNotesData', notesDataMock); store.dispatch('setNotesData', notesDataMock);
vm = mountComponent(); vm = mountComponent();
......
import Vue from 'vue'; import Vue from 'vue';
import store from '~/notes/stores'; import store from '~/notes/stores';
import issueDiscussion from '~/notes/components/issue_discussion.vue'; import issueDiscussion from '~/notes/components/issue_discussion.vue';
import { issueDataMock, discussionMock, notesDataMock } from '../mock_data'; import { noteableDataMock, discussionMock, notesDataMock } from '../mock_data';
describe('issue_discussion component', () => { describe('issue_discussion component', () => {
let vm; let vm;
...@@ -9,7 +9,7 @@ describe('issue_discussion component', () => { ...@@ -9,7 +9,7 @@ describe('issue_discussion component', () => {
beforeEach(() => { beforeEach(() => {
const Component = Vue.extend(issueDiscussion); const Component = Vue.extend(issueDiscussion);
store.dispatch('setIssueData', issueDataMock); store.dispatch('setNoteableData', noteableDataMock);
store.dispatch('setNotesData', notesDataMock); store.dispatch('setNotesData', notesDataMock);
vm = new Component({ vm = new Component({
......
...@@ -24,7 +24,7 @@ describe('issue_note_app', () => { ...@@ -24,7 +24,7 @@ describe('issue_note_app', () => {
mountComponent = (data) => { mountComponent = (data) => {
const props = data || { const props = data || {
issueData: mockData.issueDataMock, noteableData: mockData.noteableDataMock,
notesData: mockData.notesDataMock, notesData: mockData.notesDataMock,
userData: mockData.userDataMock, userData: mockData.userDataMock,
}; };
...@@ -60,7 +60,7 @@ describe('issue_note_app', () => { ...@@ -60,7 +60,7 @@ describe('issue_note_app', () => {
}); });
it('should set issue data', () => { it('should set issue data', () => {
expect(vm.$store.state.issueData).toEqual(mockData.issueDataMock); expect(vm.$store.state.noteableData).toEqual(mockData.noteableDataMock);
}); });
it('should set user data', () => { it('should set user data', () => {
......
import Vue from 'vue'; import Vue from 'vue';
import store from '~/notes/stores'; import store from '~/notes/stores';
import awardsNote from '~/notes/components/issue_note_awards_list.vue'; import awardsNote from '~/notes/components/issue_note_awards_list.vue';
import { issueDataMock, notesDataMock } from '../mock_data'; import { noteableDataMock, notesDataMock } from '../mock_data';
describe('issue_note_awards_list component', () => { describe('issue_note_awards_list component', () => {
let vm; let vm;
...@@ -10,7 +10,7 @@ describe('issue_note_awards_list component', () => { ...@@ -10,7 +10,7 @@ describe('issue_note_awards_list component', () => {
beforeEach(() => { beforeEach(() => {
const Component = Vue.extend(awardsNote); const Component = Vue.extend(awardsNote);
store.dispatch('setIssueData', issueDataMock); store.dispatch('setNoteableData', noteableDataMock);
store.dispatch('setNotesData', notesDataMock); store.dispatch('setNotesData', notesDataMock);
awardsMock = [ awardsMock = [
{ {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import Vue from 'vue'; import Vue from 'vue';
import store from '~/notes/stores'; import store from '~/notes/stores';
import noteBody from '~/notes/components/issue_note_body.vue'; import noteBody from '~/notes/components/issue_note_body.vue';
import { issueDataMock, notesDataMock, note } from '../mock_data'; import { noteableDataMock, notesDataMock, note } from '../mock_data';
describe('issue_note_body component', () => { describe('issue_note_body component', () => {
let vm; let vm;
...@@ -10,7 +10,7 @@ describe('issue_note_body component', () => { ...@@ -10,7 +10,7 @@ describe('issue_note_body component', () => {
beforeEach(() => { beforeEach(() => {
const Component = Vue.extend(noteBody); const Component = Vue.extend(noteBody);
store.dispatch('setIssueData', issueDataMock); store.dispatch('setNoteableData', noteableDataMock);
store.dispatch('setNotesData', notesDataMock); store.dispatch('setNotesData', notesDataMock);
vm = new Component({ vm = new Component({
......
import Vue from 'vue'; import Vue from 'vue';
import store from '~/notes/stores'; import store from '~/notes/stores';
import issueNoteForm from '~/notes/components/issue_note_form.vue'; import issueNoteForm from '~/notes/components/issue_note_form.vue';
import { issueDataMock, notesDataMock } from '../mock_data'; import { noteableDataMock, notesDataMock } from '../mock_data';
import { keyboardDownEvent } from '../../issue_show/helpers'; import { keyboardDownEvent } from '../../issue_show/helpers';
describe('issue_note_form component', () => { describe('issue_note_form component', () => {
...@@ -11,7 +11,7 @@ describe('issue_note_form component', () => { ...@@ -11,7 +11,7 @@ describe('issue_note_form component', () => {
beforeEach(() => { beforeEach(() => {
const Component = Vue.extend(issueNoteForm); const Component = Vue.extend(issueNoteForm);
store.dispatch('setIssueData', issueDataMock); store.dispatch('setNoteableData', noteableDataMock);
store.dispatch('setNotesData', notesDataMock); store.dispatch('setNotesData', notesDataMock);
props = { props = {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import Vue from 'vue'; import Vue from 'vue';
import store from '~/notes/stores'; import store from '~/notes/stores';
import issueNote from '~/notes/components/issue_note.vue'; import issueNote from '~/notes/components/issue_note.vue';
import { issueDataMock, notesDataMock, note } from '../mock_data'; import { noteableDataMock, notesDataMock, note } from '../mock_data';
describe('issue_note', () => { describe('issue_note', () => {
let vm; let vm;
...@@ -10,7 +10,7 @@ describe('issue_note', () => { ...@@ -10,7 +10,7 @@ describe('issue_note', () => {
beforeEach(() => { beforeEach(() => {
const Component = Vue.extend(issueNote); const Component = Vue.extend(issueNote);
store.dispatch('setIssueData', issueDataMock); store.dispatch('setNoteableData', noteableDataMock);
store.dispatch('setNotesData', notesDataMock); store.dispatch('setNotesData', notesDataMock);
vm = new Component({ vm = new Component({
......
...@@ -18,7 +18,7 @@ export const userDataMock = { ...@@ -18,7 +18,7 @@ export const userDataMock = {
username: 'root', username: 'root',
}; };
export const issueDataMock = { export const noteableDataMock = {
assignees: [], assignees: [],
author_id: 1, author_id: 1,
branch_name: null, branch_name: null,
......
import * as actions from '~/notes/stores/actions'; import * as actions from '~/notes/stores/actions';
import testAction from '../../helpers/vuex_action_helper'; import testAction from '../../helpers/vuex_action_helper';
import { discussionMock, notesDataMock, userDataMock, issueDataMock, individualNote } from '../mock_data'; import { discussionMock, notesDataMock, userDataMock, noteableDataMock, individualNote } from '../mock_data';
describe('Actions Notes Store', () => { describe('Actions Notes Store', () => {
describe('setNotesData', () => { describe('setNotesData', () => {
...@@ -11,10 +11,10 @@ describe('Actions Notes Store', () => { ...@@ -11,10 +11,10 @@ describe('Actions Notes Store', () => {
}); });
}); });
describe('setIssueData', () => { describe('setNoteableData', () => {
it('should set received issue data', (done) => { it('should set received issue data', (done) => {
testAction(actions.setIssueData, null, { issueData: {} }, [ testAction(actions.setNoteableData, null, { noteableData: {} }, [
{ type: 'SET_ISSUE_DATA', payload: issueDataMock }, { type: 'SET_NOTEABLE_DATA', payload: noteableDataMock },
], done); ], done);
}); });
}); });
......
import * as getters from '~/notes/stores/getters'; import * as getters from '~/notes/stores/getters';
import { notesDataMock, userDataMock, issueDataMock, individualNote } from '../mock_data'; import { notesDataMock, userDataMock, noteableDataMock, individualNote } from '../mock_data';
describe('Getters Notes Store', () => { describe('Getters Notes Store', () => {
let state; let state;
...@@ -11,7 +11,7 @@ describe('Getters Notes Store', () => { ...@@ -11,7 +11,7 @@ describe('Getters Notes Store', () => {
notesData: notesDataMock, notesData: notesDataMock,
userData: userDataMock, userData: userDataMock,
issueData: issueDataMock, noteableData: noteableDataMock,
}; };
}); });
describe('notes', () => { describe('notes', () => {
...@@ -32,9 +32,9 @@ describe('Getters Notes Store', () => { ...@@ -32,9 +32,9 @@ describe('Getters Notes Store', () => {
}); });
}); });
describe('getIssueData', () => { describe('getNoteableData', () => {
it('should return all data in `issueData`', () => { it('should return all data in `noteableData`', () => {
expect(getters.getIssueData(state)).toEqual(issueDataMock); expect(getters.getNoteableData(state)).toEqual(noteableDataMock);
}); });
}); });
......
import mutations from '~/notes/stores/mutations'; import mutations from '~/notes/stores/mutations';
import { note, discussionMock, notesDataMock, userDataMock, issueDataMock, individualNote } from '../mock_data'; import { note, discussionMock, notesDataMock, userDataMock, noteableDataMock, individualNote } from '../mock_data';
describe('Mutation Notes Store', () => { describe('Mutation Notes Store', () => {
describe('ADD_NEW_NOTE', () => { describe('ADD_NEW_NOTE', () => {
...@@ -74,14 +74,14 @@ describe('Mutation Notes Store', () => { ...@@ -74,14 +74,14 @@ describe('Mutation Notes Store', () => {
}); });
}); });
describe('SET_ISSUE_DATA', () => { describe('SET_NOTEABLE_DATA', () => {
it('should set the issue data', () => { it('should set the issue data', () => {
const state = { const state = {
issueData: {}, noteableData: {},
}; };
mutations.SET_ISSUE_DATA(state, issueDataMock); mutations.SET_NOTEABLE_DATA(state, noteableDataMock);
expect(state.issueData).toEqual(issueDataMock); expect(state.noteableData).toEqual(noteableDataMock);
}); });
}); });
......
...@@ -239,17 +239,31 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching ...@@ -239,17 +239,31 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
it { is_expected.to be_nil } it { is_expected.to be_nil }
end end
<<<<<<< HEAD
context 'when kubernetes responds with valid pods' do context 'when kubernetes responds with valid pods' do
before do before do
stub_kubeclient_pods stub_kubeclient_pods
end end
it { is_expected.to eq(pods: [kube_pod]) } it { is_expected.to eq(pods: [kube_pod]) }
=======
context 'when kubernetes responds with valid pods and deployments' do
before do
stub_kubeclient_pods
stub_kubeclient_deployments
end
it { is_expected.to eq(pods: [kube_pod], deployments: [kube_deployment]) }
>>>>>>> origin/master
end end
context 'when kubernetes responds with 500s' do context 'when kubernetes responds with 500s' do
before do before do
stub_kubeclient_pods(status: 500) stub_kubeclient_pods(status: 500)
<<<<<<< HEAD
=======
stub_kubeclient_deployments(status: 500)
>>>>>>> origin/master
end end
it { expect { subject }.to raise_error(KubeException) } it { expect { subject }.to raise_error(KubeException) }
...@@ -258,9 +272,16 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching ...@@ -258,9 +272,16 @@ describe Clusters::Platforms::Kubernetes, :use_clean_rails_memory_store_caching
context 'when kubernetes responds with 404s' do context 'when kubernetes responds with 404s' do
before do before do
stub_kubeclient_pods(status: 404) stub_kubeclient_pods(status: 404)
<<<<<<< HEAD
end end
it { is_expected.to eq(pods: []) } it { is_expected.to eq(pods: []) }
=======
stub_kubeclient_deployments(status: 404)
end
it { is_expected.to eq(pods: [], deployments: []) }
>>>>>>> origin/master
end end
end end
end end
...@@ -322,8 +322,8 @@ describe Environment do ...@@ -322,8 +322,8 @@ describe Environment do
end end
end end
describe '#deployment_service_ready?' do describe '#has_terminals?' do
subject { environment.deployment_service_ready? } subject { environment.has_terminals? }
context 'when the enviroment is available' do context 'when the enviroment is available' do
context 'with a deployment service' do context 'with a deployment service' do
...@@ -373,7 +373,7 @@ describe Environment do ...@@ -373,7 +373,7 @@ describe Environment do
context 'when the environment has terminals' do context 'when the environment has terminals' do
before do before do
allow(environment).to receive(:deployment_service_ready?).and_return(true) allow(environment).to receive(:has_terminals?).and_return(true)
end end
shared_examples 'same behavior between KubernetesService and Platform::Kubernetes' do shared_examples 'same behavior between KubernetesService and Platform::Kubernetes' do
...@@ -386,6 +386,17 @@ describe Environment do ...@@ -386,6 +386,17 @@ describe Environment do
end end
end end
<<<<<<< HEAD
shared_examples 'same behavior between KubernetesService and Platform::Kubernetes' do
it 'returns the terminals from the deployment service' do
expect(project.deployment_platform)
.to receive(:terminals).with(environment)
.and_return(:fake_terminals)
is_expected.to eq(:fake_terminals)
end
end
context 'when user configured kubernetes from Integration > Kubernetes' do context 'when user configured kubernetes from Integration > Kubernetes' do
let(:project) { create(:kubernetes_project) } let(:project) { create(:kubernetes_project) }
...@@ -396,13 +407,26 @@ describe Environment do ...@@ -396,13 +407,26 @@ describe Environment do
let!(:cluster) { create(:cluster, :project, :provided_by_gcp) } let!(:cluster) { create(:cluster, :project, :provided_by_gcp) }
let(:project) { cluster.project } let(:project) { cluster.project }
it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
=======
context 'when user configured kubernetes from Integration > Kubernetes' do
let(:project) { create(:kubernetes_project) }
it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes' it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
end end
context 'when user configured kubernetes from CI/CD > Clusters' do
let!(:cluster) { create(:cluster, :project, :provided_by_gcp) }
let(:project) { cluster.project }
it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
>>>>>>> origin/master
end
end end
context 'when the environment does not have terminals' do context 'when the environment does not have terminals' do
before do before do
allow(environment).to receive(:deployment_service_ready?).and_return(false) allow(environment).to receive(:has_terminals?).and_return(false)
end end
it { is_expected.to be_nil } it { is_expected.to be_nil }
...@@ -410,30 +434,50 @@ describe Environment do ...@@ -410,30 +434,50 @@ describe Environment do
end end
describe '#rollout_status' do describe '#rollout_status' do
let(:project) { create(:kubernetes_project) } shared_examples 'same behavior between KubernetesService and Platform::Kubernetes' do
subject { environment.rollout_status }
subject { environment.rollout_status } context 'when the environment has rollout status' do
before do
allow(environment).to receive(:has_terminals?).and_return(true)
end
context 'when the environment has rollout status' do it 'returns the rollout status from the deployment service' do
before do expect(project.deployment_platform)
allow(environment).to receive(:deployment_service_ready?).and_return(true) .to receive(:rollout_status).with(environment)
.and_return(:fake_rollout_status)
is_expected.to eq(:fake_rollout_status)
end
end end
<<<<<<< HEAD
it 'returns the rollout status from the deployment service' do it 'returns the rollout status from the deployment service' do
expect(project.deployment_platform) expect(project.deployment_platform)
.to receive(:rollout_status).with(environment) .to receive(:rollout_status).with(environment)
.and_return(:fake_rollout_status) .and_return(:fake_rollout_status)
=======
context 'when the environment does not have rollout status' do
before do
allow(environment).to receive(:has_terminals?).and_return(false)
end
>>>>>>> origin/master
is_expected.to eq(:fake_rollout_status) it { is_expected.to eq(nil) }
end end
end end
context 'when the environment does not have rollout status' do context 'when user configured kubernetes from Integration > Kubernetes' do
before do let(:project) { create(:kubernetes_project) }
allow(environment).to receive(:deployment_service_ready?).and_return(false)
end it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
end
context 'when user configured kubernetes from CI/CD > Clusters' do
let!(:cluster) { create(:cluster, :project, :provided_by_gcp) }
let(:project) { cluster.project }
it { is_expected.to eq(nil) } it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
end end
end end
......
...@@ -51,7 +51,7 @@ describe EnvironmentEntity do ...@@ -51,7 +51,7 @@ describe EnvironmentEntity do
context 'with deployment service ready' do context 'with deployment service ready' do
before do before do
stub_licensed_features(deploy_board: true) stub_licensed_features(deploy_board: true)
allow(environment).to receive(:deployment_service_ready?).and_return(true) allow(environment).to receive(:has_terminals?).and_return(true)
allow(environment).to receive(:rollout_status).and_return(kube_deployment_rollout_status) allow(environment).to receive(:rollout_status).and_return(kube_deployment_rollout_status)
end end
...@@ -63,7 +63,7 @@ describe EnvironmentEntity do ...@@ -63,7 +63,7 @@ describe EnvironmentEntity do
context 'when license does not has the GitLab_DeployBoard add-on' do context 'when license does not has the GitLab_DeployBoard add-on' do
before do before do
stub_licensed_features(deploy_board: false) stub_licensed_features(deploy_board: false)
allow(environment).to receive(:deployment_service_ready?).and_return(true) allow(environment).to receive(:has_terminals?).and_return(true)
end end
it 'does not expose rollout_status' do it 'does not expose rollout_status' do
......
...@@ -28,7 +28,7 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do ...@@ -28,7 +28,7 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do
allow(Gitlab::Geo).to receive(:geo_database_configured?) { false } allow(Gitlab::Geo).to receive(:geo_database_configured?) { false }
expect(GeoFileDownloadWorker).not_to receive(:perform_async) expect(Geo::FileDownloadWorker).not_to receive(:perform_async)
subject.perform subject.perform
...@@ -43,7 +43,7 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do ...@@ -43,7 +43,7 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do
secondary.enabled = false secondary.enabled = false
secondary.save secondary.save
expect(GeoFileDownloadWorker).not_to receive(:perform_async) expect(Geo::FileDownloadWorker).not_to receive(:perform_async)
subject.perform subject.perform
end end
...@@ -58,8 +58,8 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do ...@@ -58,8 +58,8 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do
end end
it 'filters S3-backed files' do it 'filters S3-backed files' do
expect(GeoFileDownloadWorker).to receive(:perform_async).with(:lfs, lfs_object_local_store.id) expect(Geo::FileDownloadWorker).to receive(:perform_async).with(:lfs, lfs_object_local_store.id)
expect(GeoFileDownloadWorker).not_to receive(:perform_async).with(:lfs, lfs_object_remote_store.id) expect(Geo::FileDownloadWorker).not_to receive(:perform_async).with(:lfs, lfs_object_remote_store.id)
subject.perform subject.perform
end end
...@@ -81,7 +81,7 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do ...@@ -81,7 +81,7 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do
create_list(:upload, 2, :personal_snippet) create_list(:upload, 2, :personal_snippet)
create(:appearance, logo: avatar, header_logo: avatar) create(:appearance, logo: avatar, header_logo: avatar)
expect(GeoFileDownloadWorker).to receive(:perform_async).exactly(10).times.and_call_original expect(Geo::FileDownloadWorker).to receive(:perform_async).exactly(10).times.and_call_original
# For 10 downloads, we expect four database reloads: # For 10 downloads, we expect four database reloads:
# 1. Load the first batch of 5. # 1. Load the first batch of 5.
# 2. 4 get sent out, 1 remains. This triggers another reload, which loads in the next 5. # 2. 4 get sent out, 1 remains. This triggers another reload, which loads in the next 5.
...@@ -103,14 +103,14 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do ...@@ -103,14 +103,14 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do
stub_const('Geo::BaseSchedulerWorker::DB_RETRIEVE_BATCH_SIZE', 1) stub_const('Geo::BaseSchedulerWorker::DB_RETRIEVE_BATCH_SIZE', 1)
expect(GeoFileDownloadWorker).not_to receive(:perform_async).with(:lfs, failed_registry.file_id) expect(Geo::FileDownloadWorker).not_to receive(:perform_async).with(:lfs, failed_registry.file_id)
expect(GeoFileDownloadWorker).to receive(:perform_async).with(:lfs, unsynced.id) expect(Geo::FileDownloadWorker).to receive(:perform_async).with(:lfs, unsynced.id)
subject.perform subject.perform
end end
it 'retries failed files' do it 'retries failed files' do
expect(GeoFileDownloadWorker).to receive(:perform_async).with('lfs', failed_registry.file_id) expect(Geo::FileDownloadWorker).to receive(:perform_async).with('lfs', failed_registry.file_id)
subject.perform subject.perform
end end
...@@ -118,7 +118,7 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do ...@@ -118,7 +118,7 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do
it 'does not retries failed files when retry_at is tomorrow' do it 'does not retries failed files when retry_at is tomorrow' do
failed_registry = create(:geo_file_registry, :lfs, file_id: 999, success: false, retry_at: Date.tomorrow) failed_registry = create(:geo_file_registry, :lfs, file_id: 999, success: false, retry_at: Date.tomorrow)
expect(GeoFileDownloadWorker).not_to receive(:perform_async).with('lfs', failed_registry.file_id) expect(Geo::FileDownloadWorker).not_to receive(:perform_async).with('lfs', failed_registry.file_id)
subject.perform subject.perform
end end
...@@ -126,7 +126,7 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do ...@@ -126,7 +126,7 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do
it 'does not retries failed files when retry_at is in the past' do it 'does not retries failed files when retry_at is in the past' do
failed_registry = create(:geo_file_registry, :lfs, file_id: 999, success: false, retry_at: Date.yesterday) failed_registry = create(:geo_file_registry, :lfs, file_id: 999, success: false, retry_at: Date.yesterday)
expect(GeoFileDownloadWorker).to receive(:perform_async).with('lfs', failed_registry.file_id) expect(Geo::FileDownloadWorker).to receive(:perform_async).with('lfs', failed_registry.file_id)
subject.perform subject.perform
end end
...@@ -143,27 +143,27 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do ...@@ -143,27 +143,27 @@ describe Geo::FileDownloadDispatchWorker, :geo, :truncate do
secondary.update_attribute(:namespaces, [synced_group]) secondary.update_attribute(:namespaces, [synced_group])
end end
it 'does not perform GeoFileDownloadWorker for LFS object that does not belong to selected namespaces to replicate' do it 'does not perform Geo::FileDownloadWorker for LFS object that does not belong to selected namespaces to replicate' do
lfs_objec_in_synced_group = create(:lfs_objects_project, project: project_in_synced_group) lfs_objec_in_synced_group = create(:lfs_objects_project, project: project_in_synced_group)
create(:lfs_objects_project, project: unsynced_project) create(:lfs_objects_project, project: unsynced_project)
expect(GeoFileDownloadWorker).to receive(:perform_async) expect(Geo::FileDownloadWorker).to receive(:perform_async)
.with(:lfs, lfs_objec_in_synced_group.lfs_object_id).once.and_return(spy) .with(:lfs, lfs_objec_in_synced_group.lfs_object_id).once.and_return(spy)
subject.perform subject.perform
end end
it 'does not perform GeoFileDownloadWorker for upload objects that do not belong to selected namespaces to replicate' do it 'does not perform Geo::FileDownloadWorker for upload objects that do not belong to selected namespaces to replicate' do
avatar = fixture_file_upload(Rails.root.join('spec/fixtures/dk.png')) avatar = fixture_file_upload(Rails.root.join('spec/fixtures/dk.png'))
avatar_in_synced_group = create(:upload, model: synced_group, path: avatar) avatar_in_synced_group = create(:upload, model: synced_group, path: avatar)
create(:upload, model: create(:group), path: avatar) create(:upload, model: create(:group), path: avatar)
avatar_in_project_in_synced_group = create(:upload, model: project_in_synced_group, path: avatar) avatar_in_project_in_synced_group = create(:upload, model: project_in_synced_group, path: avatar)
create(:upload, model: unsynced_project, path: avatar) create(:upload, model: unsynced_project, path: avatar)
expect(GeoFileDownloadWorker).to receive(:perform_async) expect(Geo::FileDownloadWorker).to receive(:perform_async)
.with('avatar', avatar_in_project_in_synced_group.id).once.and_return(spy) .with('avatar', avatar_in_project_in_synced_group.id).once.and_return(spy)
expect(GeoFileDownloadWorker).to receive(:perform_async) expect(Geo::FileDownloadWorker).to receive(:perform_async)
.with('avatar', avatar_in_synced_group.id).once.and_return(spy) .with('avatar', avatar_in_synced_group.id).once.and_return(spy)
subject.perform subject.perform
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment