From 07365e518330289149dd2135424c49fad19f401d Mon Sep 17 00:00:00 2001 From: Keith Pope Date: Fri, 5 Aug 2016 10:29:09 +0100 Subject: [PATCH 0001/1380] Add config option to project to allow custom .gitlab-ci.yml location --- .../projects/pipelines_settings_controller.rb | 2 +- app/models/ci/pipeline.rb | 10 +++- app/models/project.rb | 13 +++++ .../pipelines_settings/show.html.haml | 7 +++ ...804142904_add_ci_config_file_to_project.rb | 18 +++++++ db/schema.rb | 1 + doc/api/projects.md | 3 ++ doc/user/project/pipelines/settings.md | 54 +++++++++++++++++++ lib/api/entities.rb | 1 + lib/api/projects.rb | 6 +++ spec/models/ci/pipeline_spec.rb | 30 +++++++++++ spec/models/project_spec.rb | 1 + spec/requests/api/projects_spec.rb | 4 +- 13 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20160804142904_add_ci_config_file_to_project.rb create mode 100644 doc/user/project/pipelines/settings.md diff --git a/app/controllers/projects/pipelines_settings_controller.rb b/app/controllers/projects/pipelines_settings_controller.rb index 9136633b87a..d23418a9aa3 100644 --- a/app/controllers/projects/pipelines_settings_controller.rb +++ b/app/controllers/projects/pipelines_settings_controller.rb @@ -30,7 +30,7 @@ class Projects::PipelinesSettingsController < Projects::ApplicationController def update_params params.require(:project).permit( :runners_token, :builds_enabled, :build_allow_git_fetch, :build_timeout_in_minutes, :build_coverage_regex, - :public_builds + :public_builds, :ci_config_file ) end end diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index 2cf9892edc5..e6cd71a7bf2 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -218,14 +218,22 @@ module Ci return @ci_yaml_file if defined?(@ci_yaml_file) @ci_yaml_file ||= begin - blob = project.repository.blob_at(sha, '.gitlab-ci.yml') + blob = project.repository.blob_at(sha, ci_yaml_file_path) blob.load_all_data!(project.repository) blob.data rescue + self.yaml_errors = 'Failed to load CI config file' nil end end + def ci_yaml_file_path + return '.gitlab-ci.yml' if project.ci_config_file.blank? + return project.ci_config_file if File.extname(project.ci_config_file.to_s) == '.yml' + + File.join(project.ci_config_file || '', '.gitlab-ci.yml') + end + def environments builds.where.not(environment: nil).success.pluck(:environment).uniq end diff --git a/app/models/project.rb b/app/models/project.rb index 88e4bd14860..272c89798b6 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -154,6 +154,11 @@ class Project < ActiveRecord::Base # Validations validates :creator, presence: true, on: :create validates :description, length: { maximum: 2000 }, allow_blank: true + validates :ci_config_file, + format: { without: Gitlab::Regex.directory_traversal_regex, + message: Gitlab::Regex.directory_traversal_regex_message }, + length: { maximum: 255 }, + allow_blank: true validates :name, presence: true, length: { within: 0..255 }, @@ -182,6 +187,7 @@ class Project < ActiveRecord::Base add_authentication_token_field :runners_token before_save :ensure_runners_token + before_validation :clean_ci_config_file mount_uploader :avatar, AvatarUploader @@ -986,6 +992,7 @@ class Project < ActiveRecord::Base visibility_level: visibility_level, path_with_namespace: path_with_namespace, default_branch: default_branch, + ci_config_file: ci_config_file } # Backward compatibility @@ -1349,4 +1356,10 @@ class Project < ActiveRecord::Base shared_projects.any? end + + def clean_ci_config_file + return unless self.ci_config_file + # Cleanup path removing leading/trailing slashes + self.ci_config_file = ci_config_file.gsub(/^\/+|\/+$/, '') + end end diff --git a/app/views/projects/pipelines_settings/show.html.haml b/app/views/projects/pipelines_settings/show.html.haml index 8c7222bfe3d..25a991cdbfc 100644 --- a/app/views/projects/pipelines_settings/show.html.haml +++ b/app/views/projects/pipelines_settings/show.html.haml @@ -32,6 +32,13 @@ = f.label :build_timeout_in_minutes, 'Timeout', class: 'label-light' = f.number_field :build_timeout_in_minutes, class: 'form-control', min: '0' %p.help-block per build in minutes + .form-group + = f.label :ci_config_file, 'Custom CI Config File', class: 'label-light' + = f.text_field :ci_config_file, class: 'form-control', placeholder: '.gitlab-ci.yml' + %p.help-block + Optionally specify the location of your CI config file E.g. my/path or my/path/.my-config.yml. + Default is to use '.gitlab-ci.yml' in the repository root. + .form-group = f.label :build_coverage_regex, "Test coverage parsing", class: 'label-light' .input-group diff --git a/db/migrate/20160804142904_add_ci_config_file_to_project.rb b/db/migrate/20160804142904_add_ci_config_file_to_project.rb new file mode 100644 index 00000000000..4b9860c5f74 --- /dev/null +++ b/db/migrate/20160804142904_add_ci_config_file_to_project.rb @@ -0,0 +1,18 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class AddCiConfigFileToProject < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def change + add_column :projects, :ci_config_file, :string + end + + def down + remove_column :projects, :ci_config_file + end +end diff --git a/db/schema.rb b/db/schema.rb index 56da70b3c02..26883a72f1f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -889,6 +889,7 @@ ActiveRecord::Schema.define(version: 20160926145521) do t.boolean "has_external_wiki" t.boolean "lfs_enabled" t.text "description_html" + t.string "ci_config_file" end add_index "projects", ["ci_id"], name: "index_projects_on_ci_id", using: :btree diff --git a/doc/api/projects.md b/doc/api/projects.md index 27436a052da..af229326eee 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -604,6 +604,7 @@ Parameters: | `only_allow_merge_if_build_succeeds` | boolean | no | Set whether merge requests can only be merged with successful builds | | `lfs_enabled` | boolean | no | Enable LFS | | `request_access_enabled` | boolean | no | Allow users to request member access | +| `ci_config_file` | boolean | no | The relative path to the CI config file (E.g. my/path or my/path/.gitlab-ci.yml or my/path/my-config.yml) | ### Create project for user @@ -636,6 +637,7 @@ Parameters: | `only_allow_merge_if_build_succeeds` | boolean | no | Set whether merge requests can only be merged with successful builds | | `lfs_enabled` | boolean | no | Enable LFS | | `request_access_enabled` | boolean | no | Allow users to request member access | +| `ci_config_file` | boolean | no | The relative path to the CI config file (E.g. my/path or my/path/.gitlab-ci.yml or my/path/my-config.yml) | ### Edit project @@ -667,6 +669,7 @@ Parameters: | `only_allow_merge_if_build_succeeds` | boolean | no | Set whether merge requests can only be merged with successful builds | | `lfs_enabled` | boolean | no | Enable LFS | | `request_access_enabled` | boolean | no | Allow users to request member access | +| `ci_config_file` | boolean | no | The relative path to the CI config file (E.g. my/path or my/path/.gitlab-ci.yml or my/path/my-config.yml) | On success, method returns 200 with the updated project. If parameters are invalid, 400 is returned. diff --git a/doc/user/project/pipelines/settings.md b/doc/user/project/pipelines/settings.md new file mode 100644 index 00000000000..272ee71bfed --- /dev/null +++ b/doc/user/project/pipelines/settings.md @@ -0,0 +1,54 @@ +# Project Pipeline Settings + +This section covers project level pipeline settings. + +## Clone vs Fetch + +You can select to either `git fetch` or `git clone` your project before +each build. Fetching is faster as you are only pulling recent updates +but cloning has the advantage of giving you a clean project. + +## Timeout + +This is the total time in minutes that a build is allowed to run. The +default is 222 minutes. + +## Custom CI Config File + +> - [Introduced][ce-15041] in GitLab 8.13. + +By default we look for the `.gitlab-ci.yml` file in the projects root +directory. If you require a different location **within** the repository +you can set a custom filepath that will be used to lookup the config file, +this filepath should be **relative** to the root. + +Here are some valid examples: + +> * .gitlab-ci.yml +> * .my-custom-file.yml +> * my/path/.gitlab-ci.yml +> * my/path/.my-custom-file.yml + +## Test Coverage Parsing + +As each testing framework has different output, you need to specify a +regex to extract the summary code coverage information from your test +commands output. The regex will be applied to the `STDOUT` of your command. + +Here are some examples of popular testing frameworks/languages: + +> * Simplecov (Ruby) - `\(\d+.\d+\%\) covered` +> * pytest-cov (Python) - `\d+\%\s*$` +> * phpunit --coverage-text --colors=never (PHP) - `^\s*Lines:\s*\d+.\d+\%` +> * gcovr (C/C++) - `^TOTAL.*\s+(\d+\%)$` +> * tap --coverage-report=text-summary (Node.js) - `^Statements\s*:\s*([^%]+)` + + +## Public Pipelines + +You can select if the pipeline should be publicly accessible or not. + +## Runners Token + +This is a secure token that is used to checkout the project from the +Gitlab instance. This should be a cryptographically secure random hash. diff --git a/lib/api/entities.rb b/lib/api/entities.rb index feaa0c213bf..c84a7ef19db 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -96,6 +96,7 @@ module API expose :open_issues_count, if: lambda { |project, options| project.feature_available?(:issues, options[:user]) && project.default_issues_tracker? } expose :runners_token, if: lambda { |_project, options| options[:user_can_admin_project] } expose :public_builds + expose :ci_config_file expose :shared_with_groups do |project, options| SharedGroup.represent(project.project_group_links.all, options) end diff --git a/lib/api/projects.rb b/lib/api/projects.rb index c24e8e8bd9b..291e7b689bf 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -118,12 +118,14 @@ module API # public_builds (optional) # lfs_enabled (optional) # request_access_enabled (optional) - Allow users to request member access + # ci_config_file (optional) # Example Request # POST /projects post do required_attributes! [:name] attrs = attributes_for_keys [:builds_enabled, :container_registry_enabled, + :ci_config_file, :description, :import_url, :issues_enabled, @@ -173,12 +175,14 @@ module API # public_builds (optional) # lfs_enabled (optional) # request_access_enabled (optional) - Allow users to request member access + # ci_config_file (optional) # Example Request # POST /projects/user/:user_id post "user/:user_id" do authenticated_as_admin! user = User.find(params[:user_id]) attrs = attributes_for_keys [:builds_enabled, + :ci_config_file, :default_branch, :description, :import_url, @@ -256,11 +260,13 @@ module API # visibility_level (optional) - visibility level of a project # public_builds (optional) # lfs_enabled (optional) + # ci_config_file (optional) # Example Request # PUT /projects/:id put ':id' do attrs = attributes_for_keys [:builds_enabled, :container_registry_enabled, + :ci_config_file, :default_branch, :description, :issues_enabled, diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb index 550a890797e..8d774666d2b 100644 --- a/spec/models/ci/pipeline_spec.rb +++ b/spec/models/ci/pipeline_spec.rb @@ -403,6 +403,36 @@ describe Ci::Pipeline, models: true do end end + describe 'yaml config file resolution' do + let(:project) { FactoryGirl.build(:project) } + + let(:pipeline) { create(:ci_empty_pipeline, project: project) } + it 'uses custom ci config file path when present' do + allow(project).to receive(:ci_config_file) { 'custom/path' } + expect(pipeline.ci_yaml_file_path).to eq('custom/path/.gitlab-ci.yml') + end + it 'uses root when custom path is nil' do + allow(project).to receive(:ci_config_file) { nil } + expect(pipeline.ci_yaml_file_path).to eq('.gitlab-ci.yml') + end + it 'uses root when custom path is empty' do + allow(project).to receive(:ci_config_file) { '' } + expect(pipeline.ci_yaml_file_path).to eq('.gitlab-ci.yml') + end + it 'allows custom filename' do + allow(project).to receive(:ci_config_file) { 'custom/path/.my-config.yml' } + expect(pipeline.ci_yaml_file_path).to eq('custom/path/.my-config.yml') + end + it 'custom filename must be yml' do + allow(project).to receive(:ci_config_file) { 'custom/path/.my-config.cnf' } + expect(pipeline.ci_yaml_file_path).to eq('custom/path/.my-config.cnf/.gitlab-ci.yml') + end + it 'reports error if the file is not found' do + pipeline.ci_yaml_file + expect(pipeline.yaml_errors).to eq('Failed to load CI config file') + end + end + describe '#execute_hooks' do let!(:build_a) { create_build('a', 0) } let!(:build_b) { create_build('b', 1) } diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 8aadfcb439b..363b5ff1913 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -118,6 +118,7 @@ describe Project, models: true do it { is_expected.to validate_uniqueness_of(:path).scoped_to(:namespace_id) } it { is_expected.to validate_length_of(:path).is_within(0..255) } it { is_expected.to validate_length_of(:description).is_within(0..2000) } + it { is_expected.to validate_length_of(:ci_config_file).is_within(0..255) } it { is_expected.to validate_presence_of(:creator) } it { is_expected.to validate_presence_of(:namespace) } it { is_expected.to validate_presence_of(:repository_storage) } diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index 5f19638b460..80e5deb7f92 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -256,7 +256,8 @@ describe API::API, api: true do merge_requests_enabled: false, wiki_enabled: false, only_allow_merge_if_build_succeeds: false, - request_access_enabled: true + request_access_enabled: true, + ci_config_file: 'a/custom/path' }) post api('/projects', user), project @@ -503,6 +504,7 @@ describe API::API, api: true do expect(json_response['star_count']).to be_present expect(json_response['forks_count']).to be_present expect(json_response['public_builds']).to be_present + expect(json_response['ci_config_file']).to be_nil expect(json_response['shared_with_groups']).to be_an Array expect(json_response['shared_with_groups'].length).to eq(1) expect(json_response['shared_with_groups'][0]['group_id']).to eq(group.id) From 2c4a69616b59428ffe23908c96241d82ca316bcd Mon Sep 17 00:00:00 2001 From: Stefan Hanreich Date: Tue, 9 May 2017 18:34:14 +0200 Subject: [PATCH 0002/1380] no trailing / leading hyphens in CI_COMMIT_REF_SLUG. Fixes #32035 --- app/models/ci/build.rb | 4 +++- doc/ci/variables/README.md | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index 971ab7cb0ee..d21f79560c4 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -170,9 +170,11 @@ module Ci # * Lowercased # * Anything not matching [a-z0-9-] is replaced with a - # * Maximum length is 63 bytes + # * First/Last Character is not a hyphen def ref_slug slugified = ref.to_s.downcase - slugified.gsub(/[^a-z0-9]/, '-')[0..62] + slugified = slugified.gsub(/[^a-z0-9]/, '-')[0..62] + slugified.gsub(/(^\-+|\-+$)/, '') end # Variables whose value does not depend on other variables diff --git a/doc/ci/variables/README.md b/doc/ci/variables/README.md index 045d3821f66..f0c92540fbb 100644 --- a/doc/ci/variables/README.md +++ b/doc/ci/variables/README.md @@ -37,7 +37,7 @@ future GitLab releases.** |-------------------------------- |--------|--------|-------------| | **CI** | all | 0.4 | Mark that job is executed in CI environment | | **CI_COMMIT_REF_NAME** | 9.0 | all | The branch or tag name for which project is built | -| **CI_COMMIT_REF_SLUG** | 9.0 | all | `$CI_COMMIT_REF_NAME` lowercased, shortened to 63 bytes, and with everything except `0-9` and `a-z` replaced with `-`. Use in URLs and domain names. | +| **CI_COMMIT_REF_SLUG** | 9.0 | all | `$CI_COMMIT_REF_NAME` lowercased, shortened to 63 bytes, and with everything except `0-9` and `a-z` replaced with `-`. No leading / trailing `-`. Use in URLs, host names and domain names. | | **CI_COMMIT_SHA** | 9.0 | all | The commit revision for which project is built | | **CI_COMMIT_TAG** | 9.0 | 0.5 | The commit tag name. Present only when building tags. | | **CI_DEBUG_TRACE** | all | 1.7 | Whether [debug tracing](#debug-tracing) is enabled | From 3c4f414bfccd0fda4bea4f6d553159f06bc78124 Mon Sep 17 00:00:00 2001 From: Stefan Hanreich Date: Tue, 9 May 2017 18:34:14 +0200 Subject: [PATCH 0003/1380] no trailing / leading hyphens in CI_COMMIT_REF_SLUG. Fixes #32035 --- app/models/ci/build.rb | 4 +++- doc/ci/variables/README.md | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index 3c4a4d93349..756f976a449 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -170,9 +170,11 @@ module Ci # * Lowercased # * Anything not matching [a-z0-9-] is replaced with a - # * Maximum length is 63 bytes + # * First/Last Character is not a hyphen def ref_slug slugified = ref.to_s.downcase - slugified.gsub(/[^a-z0-9]/, '-')[0..62] + slugified = slugified.gsub(/[^a-z0-9]/, '-')[0..62] + slugified.gsub(/(^\-+|\-+$)/, '') end # Variables whose value does not depend on other variables diff --git a/doc/ci/variables/README.md b/doc/ci/variables/README.md index 045d3821f66..f0c92540fbb 100644 --- a/doc/ci/variables/README.md +++ b/doc/ci/variables/README.md @@ -37,7 +37,7 @@ future GitLab releases.** |-------------------------------- |--------|--------|-------------| | **CI** | all | 0.4 | Mark that job is executed in CI environment | | **CI_COMMIT_REF_NAME** | 9.0 | all | The branch or tag name for which project is built | -| **CI_COMMIT_REF_SLUG** | 9.0 | all | `$CI_COMMIT_REF_NAME` lowercased, shortened to 63 bytes, and with everything except `0-9` and `a-z` replaced with `-`. Use in URLs and domain names. | +| **CI_COMMIT_REF_SLUG** | 9.0 | all | `$CI_COMMIT_REF_NAME` lowercased, shortened to 63 bytes, and with everything except `0-9` and `a-z` replaced with `-`. No leading / trailing `-`. Use in URLs, host names and domain names. | | **CI_COMMIT_SHA** | 9.0 | all | The commit revision for which project is built | | **CI_COMMIT_TAG** | 9.0 | 0.5 | The commit tag name. Present only when building tags. | | **CI_DEBUG_TRACE** | all | 1.7 | Whether [debug tracing](#debug-tracing) is enabled | From 18759f46c53148ff63291276e5f8bb8ac642711f Mon Sep 17 00:00:00 2001 From: Stefan Hanreich Date: Thu, 11 May 2017 17:28:44 +0200 Subject: [PATCH 0004/1380] added changelog entry --- .../unreleased/feature-no-hypen-at-end-of-commit-ref-slug.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/feature-no-hypen-at-end-of-commit-ref-slug.yml diff --git a/changelogs/unreleased/feature-no-hypen-at-end-of-commit-ref-slug.yml b/changelogs/unreleased/feature-no-hypen-at-end-of-commit-ref-slug.yml new file mode 100644 index 00000000000..f5ade3536d3 --- /dev/null +++ b/changelogs/unreleased/feature-no-hypen-at-end-of-commit-ref-slug.yml @@ -0,0 +1,4 @@ +--- +title: Omit trailing / leding hyphens in CI_COMMIT_REF_SLUG variable +merge_request: 11218 +author: Stefan Hanreich From ac516151a63a4fe69363b208b4f53e74e27df94c Mon Sep 17 00:00:00 2001 From: Stefan Hanreich Date: Thu, 11 May 2017 20:04:36 +0200 Subject: [PATCH 0005/1380] Updated spec for build to include new ref_slug invariants --- spec/models/ci/build_spec.rb | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb index e971b4bc3f9..407b49a1ff7 100644 --- a/spec/models/ci/build_spec.rb +++ b/spec/models/ci/build_spec.rb @@ -965,19 +965,27 @@ describe Ci::Build, :models do end describe '#ref_slug' do + let(:build) { build(:ci_build, ref: "'100%") } + subject { build.ref_slug } + + it { is_expected.not_to start_with('-') } + it { is_expected.not_to end_with('-') } + { - 'master' => 'master', - '1-foo' => '1-foo', - 'fix/1-foo' => 'fix-1-foo', - 'fix-1-foo' => 'fix-1-foo', - 'a' * 63 => 'a' * 63, - 'a' * 64 => 'a' * 63, - 'FOO' => 'foo' + 'master' => 'master', + '1-foo' => '1-foo', + 'fix/1-foo' => 'fix-1-foo', + 'fix-1-foo' => 'fix-1-foo', + 'a' * 63 => 'a' * 63, + 'a' * 64 => 'a' * 63, + 'FOO' => 'foo', + '-' + 'a' * 61 + '-' => 'a' * 61, + 'a' * 62 + ' ' => 'a' * 62, }.each do |ref, slug| it "transforms #{ref} to #{slug}" do build.ref = ref - expect(build.ref_slug).to eq(slug) + is_expected.to eq(slug) end end end From a1279eb543e5f29d93c2eedc42878cd60e5c238d Mon Sep 17 00:00:00 2001 From: Stefan Hanreich Date: Thu, 11 May 2017 20:14:15 +0200 Subject: [PATCH 0006/1380] updated regex to use beginning / ending of string metacharacters --- app/models/ci/build.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index 756f976a449..1dc5035605c 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -174,7 +174,7 @@ module Ci def ref_slug slugified = ref.to_s.downcase slugified = slugified.gsub(/[^a-z0-9]/, '-')[0..62] - slugified.gsub(/(^\-+|\-+$)/, '') + slugified.gsub(/(\A-+|-+\z)/, '') end # Variables whose value does not depend on other variables From 3101992320687b05a7e951c0c3befeb1d4093b45 Mon Sep 17 00:00:00 2001 From: Stefan Hanreich Date: Thu, 11 May 2017 20:50:59 +0200 Subject: [PATCH 0007/1380] removed superfluos tests --- spec/models/ci/build_spec.rb | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb index 407b49a1ff7..c29c62a2580 100644 --- a/spec/models/ci/build_spec.rb +++ b/spec/models/ci/build_spec.rb @@ -965,12 +965,6 @@ describe Ci::Build, :models do end describe '#ref_slug' do - let(:build) { build(:ci_build, ref: "'100%") } - subject { build.ref_slug } - - it { is_expected.not_to start_with('-') } - it { is_expected.not_to end_with('-') } - { 'master' => 'master', '1-foo' => '1-foo', @@ -985,7 +979,7 @@ describe Ci::Build, :models do it "transforms #{ref} to #{slug}" do build.ref = ref - is_expected.to eq(slug) + expected(build.ref_slug).to eq(slug) end end end From d4e372d5c4f9c72b36481febdd5bec55edc9ee77 Mon Sep 17 00:00:00 2001 From: Stefan Hanreich Date: Thu, 11 May 2017 20:54:41 +0200 Subject: [PATCH 0008/1380] fix typo --- spec/models/ci/build_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb index c29c62a2580..02a2877e6fd 100644 --- a/spec/models/ci/build_spec.rb +++ b/spec/models/ci/build_spec.rb @@ -979,7 +979,7 @@ describe Ci::Build, :models do it "transforms #{ref} to #{slug}" do build.ref = ref - expected(build.ref_slug).to eq(slug) + expect(build.ref_slug).to eq(slug) end end end From 78cf7dd9d83ef65be414b526b226e1620970dc27 Mon Sep 17 00:00:00 2001 From: Stefan Hanreich Date: Thu, 11 May 2017 21:42:39 +0200 Subject: [PATCH 0009/1380] remove trailing comma --- spec/models/ci/build_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb index 02a2877e6fd..fbba2c8be60 100644 --- a/spec/models/ci/build_spec.rb +++ b/spec/models/ci/build_spec.rb @@ -974,7 +974,7 @@ describe Ci::Build, :models do 'a' * 64 => 'a' * 63, 'FOO' => 'foo', '-' + 'a' * 61 + '-' => 'a' * 61, - 'a' * 62 + ' ' => 'a' * 62, + 'a' * 62 + ' ' => 'a' * 62 }.each do |ref, slug| it "transforms #{ref} to #{slug}" do build.ref = ref From 589d7ea484f7215cff6570080caf47751f712ed9 Mon Sep 17 00:00:00 2001 From: Stefan Hanreich Date: Thu, 11 May 2017 21:59:05 +0200 Subject: [PATCH 0010/1380] using bang method for gsub --- app/models/ci/build.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index 1dc5035605c..259d29e84d1 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -173,8 +173,8 @@ module Ci # * First/Last Character is not a hyphen def ref_slug slugified = ref.to_s.downcase - slugified = slugified.gsub(/[^a-z0-9]/, '-')[0..62] - slugified.gsub(/(\A-+|-+\z)/, '') + slugified.gsub!(/[^a-z0-9]/, '-') + slugified[0..62].gsub(/(\A-+|-+\z)/, '') end # Variables whose value does not depend on other variables From 2061414054ce43aa6d53d1be3f602114e5a336d2 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Wed, 10 May 2017 11:25:30 +0200 Subject: [PATCH 0011/1380] Additional metrics initial work, with working metrics listing, but without actoual metrics mesurements --- .../projects/environments_controller.rb | 6 ++ .../projects/prometheus_controller.rb | 22 ++++++ app/models/environment.rb | 8 +++ .../project_services/prometheus_service.rb | 20 ++++-- config/additional_metrics.yml | 26 +++++++ config/routes/project.rb | 5 ++ lib/gitlab/prometheus/metric.rb | 28 ++++++++ lib/gitlab/prometheus/metric_group.rb | 33 +++++++++ lib/gitlab/prometheus/metrics_sources.rb | 7 ++ lib/gitlab/prometheus/parsing_error.rb | 3 + .../queries/additional_metrics_query.rb | 70 ++++++++++++++++++ lib/gitlab/prometheus/queries/base_query.rb | 2 +- .../queries/matched_metrics_query.rb | 72 +++++++++++++++++++ lib/gitlab/prometheus_client.rb | 8 +++ 14 files changed, 304 insertions(+), 6 deletions(-) create mode 100644 app/controllers/projects/prometheus_controller.rb create mode 100644 config/additional_metrics.yml create mode 100644 lib/gitlab/prometheus/metric.rb create mode 100644 lib/gitlab/prometheus/metric_group.rb create mode 100644 lib/gitlab/prometheus/metrics_sources.rb create mode 100644 lib/gitlab/prometheus/parsing_error.rb create mode 100644 lib/gitlab/prometheus/queries/additional_metrics_query.rb create mode 100644 lib/gitlab/prometheus/queries/matched_metrics_query.rb diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index efe83776834..6d230e84ef7 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -129,6 +129,12 @@ class Projects::EnvironmentsController < Projects::ApplicationController end end + def additional_metrics + additional_metrics = environment.additional_metrics || {} + + render json: additional_metrics, status: additional_metrics.any? ? :ok : :no_content + end + private def verify_api_request! diff --git a/app/controllers/projects/prometheus_controller.rb b/app/controllers/projects/prometheus_controller.rb new file mode 100644 index 00000000000..74e247535d5 --- /dev/null +++ b/app/controllers/projects/prometheus_controller.rb @@ -0,0 +1,22 @@ +class Projects::PrometheusController < Projects::ApplicationController + before_action :authorize_read_project! + + def active_metrics + return render_404 unless has_prometheus_metrics? + matched_metrics = prometheus_service.reactive_query(Gitlab::Prometheus::Queries::MatchedMetricsQuery.name, &:itself) + + if matched_metrics + render json: matched_metrics, status: :ok + else + head :no_content + end + end + + def prometheus_service + project.monitoring_service + end + + def has_prometheus_metrics? + prometheus_service&.respond_to?(:reactive_query) + end +end diff --git a/app/models/environment.rb b/app/models/environment.rb index 61572d8d69a..b4a4f74a8d5 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -149,10 +149,18 @@ class Environment < ActiveRecord::Base project.monitoring_service.present? && available? && last_deployment.present? end + def has_additional_metrics? + has_metrics? && project.monitoring_service&.respond_to?(:reactive_query) + end + def metrics project.monitoring_service.environment_metrics(self) if has_metrics? end + def additional_metrics + project.monitoring_service.reactive_query(Gitlab::Prometheus::Queries::AdditionalMetricsQuery, self.id) if has_additional_metrics? + end + # An environment name is not necessarily suitable for use in URLs, DNS # or other third-party contexts, so provide a slugified version. A slug has # the following properties: diff --git a/app/models/project_services/prometheus_service.rb b/app/models/project_services/prometheus_service.rb index ec72cb6856d..674d485a03c 100644 --- a/app/models/project_services/prometheus_service.rb +++ b/app/models/project_services/prometheus_service.rb @@ -64,23 +64,26 @@ class PrometheusService < MonitoringService end def environment_metrics(environment) - with_reactive_cache(Gitlab::Prometheus::Queries::EnvironmentQuery.name, environment.id, &:itself) + with_reactive_cache(Gitlab::Prometheus::Queries::EnvironmentQuery.name, environment.id, &method(:rename_data_to_metrics)) end def deployment_metrics(deployment) - metrics = with_reactive_cache(Gitlab::Prometheus::Queries::DeploymentQuery.name, deployment.id, &:itself) + metrics = with_reactive_cache(Gitlab::Prometheus::Queries::DeploymentQuery.name, deployment.id, &method(:rename_data_to_metrics)) metrics&.merge(deployment_time: created_at.to_i) || {} end + def reactive_query(query_class, *args, &block) + calculate_reactive_cache(query_class, *args, &block) + end + # Cache metrics for specific environment def calculate_reactive_cache(query_class_name, *args) return unless active? && project && !project.pending_delete? - metrics = Kernel.const_get(query_class_name).new(client).query(*args) - + data = Kernel.const_get(query_class_name).new(client).query(*args) { success: true, - metrics: metrics, + data: data, last_update: Time.now.utc } rescue Gitlab::PrometheusError => err @@ -90,4 +93,11 @@ class PrometheusService < MonitoringService def client @prometheus ||= Gitlab::PrometheusClient.new(api_url: api_url) end + + private + + def rename_data_to_metrics(metrics) + metrics[:metrics] = metrics.delete :data + metrics + end end diff --git a/config/additional_metrics.yml b/config/additional_metrics.yml new file mode 100644 index 00000000000..209209f4b30 --- /dev/null +++ b/config/additional_metrics.yml @@ -0,0 +1,26 @@ +- group: Kubernetes + priority: 1 + metrics: + - title: "Memory usage" + detect: container_memory_usage_bytes + weight: 1 + queries: + - query_range: 'avg(container_memory_usage_bytes{%{environment_filter}}) / 2^20' + label: Container memory + unit: MiB + - title: "Current memory usage" + detect: container_memory_usage_bytes + weight: 1 + queries: + - query: 'avg(container_memory_usage_bytes{%{environment_filter}}) / 2^20' + unit: MiB + - title: "CPU usage" + detect: container_cpu_usage_seconds_total + weight: 1 + queries: + - query_range: 'avg(rate(container_cpu_usage_seconds_total{%{environment_filter}}[2m])) * 100' + - title: "Current CPU usage" + detect: container_cpu_usage_seconds_total + weight: 1 + queries: + - query: 'avg(rate(container_cpu_usage_seconds_total{%{environment_filter}}[2m])) * 100' diff --git a/config/routes/project.rb b/config/routes/project.rb index 9fe8372edf9..f5d00e4e93b 100644 --- a/config/routes/project.rb +++ b/config/routes/project.rb @@ -72,6 +72,10 @@ constraints(ProjectUrlConstrainer.new) do resource :mattermost, only: [:new, :create] + namespace :prometheus do + get :active_metrics + end + resources :deploy_keys, constraints: { id: /\d+/ }, only: [:index, :new, :create] do member do put :enable @@ -152,6 +156,7 @@ constraints(ProjectUrlConstrainer.new) do post :stop get :terminal get :metrics + get :additional_metrics get '/terminal.ws/authorize', to: 'environments#terminal_websocket_authorize', constraints: { format: nil } end diff --git a/lib/gitlab/prometheus/metric.rb b/lib/gitlab/prometheus/metric.rb new file mode 100644 index 00000000000..2818afb34b0 --- /dev/null +++ b/lib/gitlab/prometheus/metric.rb @@ -0,0 +1,28 @@ +module Gitlab::Prometheus + class Metric + attr_reader :group, :title, :detect, :weight, :queries + + def initialize(group, title, detect, weight, queries = []) + @group = group + @title = title + @detect = detect + @weight = weight + @queries = queries + end + + def self.metric_from_entry(group, entry) + missing_fields = [:title, :detect, :weight, :queries].select { |key| !entry.has_key?(key) } + raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? + + Metric.new(group, entry[:title], entry[:detect], entry[:weight], entry[:queries]) + end + + def self.metrics_from_list(group, list) + list.map { |entry| metric_from_entry(group, entry) } + end + + def self.additional_metrics_raw + @additional_metrics_raw ||= YAML.load_file(Rails.root.join('config/additional_metrics.yml')).map(&:deep_symbolize_keys) + end + end +end diff --git a/lib/gitlab/prometheus/metric_group.rb b/lib/gitlab/prometheus/metric_group.rb new file mode 100644 index 00000000000..093390b4fa7 --- /dev/null +++ b/lib/gitlab/prometheus/metric_group.rb @@ -0,0 +1,33 @@ +module Gitlab::Prometheus + class MetricGroup + attr_reader :priority, :name + attr_accessor :metrics + + def initialize(name, priority, metrics = []) + @name = name + @priority = priority + @metrics = metrics + end + + def self.all + load_groups_from_yaml + end + + def self.group_from_entry(entry) + missing_fields = [:group, :priority, :metrics].select { |key| !entry.has_key?(key) } + raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? + + group = MetricGroup.new(entry[:group], entry[:priority]) + group.metrics = Metric.metrics_from_list(group, entry[:metrics]) + group + end + + def self.load_groups_from_yaml + additional_metrics_raw.map(&method(:group_from_entry)) + end + + def self.additional_metrics_raw + @additional_metrics_raw ||= YAML.load_file(Rails.root.join('config/additional_metrics.yml'))&.map(&:deep_symbolize_keys).freeze + end + end +end diff --git a/lib/gitlab/prometheus/metrics_sources.rb b/lib/gitlab/prometheus/metrics_sources.rb new file mode 100644 index 00000000000..500b6e971a2 --- /dev/null +++ b/lib/gitlab/prometheus/metrics_sources.rb @@ -0,0 +1,7 @@ +module Gitlab::Prometheus + module MetricsSources + def self.additional_metrics + @additional_metrics ||= YAML.load_file(Rails.root.join('config/additional_metrics.yml')).deep_symbolize_keys.freeze + end + end +end diff --git a/lib/gitlab/prometheus/parsing_error.rb b/lib/gitlab/prometheus/parsing_error.rb new file mode 100644 index 00000000000..067ea7f878a --- /dev/null +++ b/lib/gitlab/prometheus/parsing_error.rb @@ -0,0 +1,3 @@ +module Gitlab::Prometheus + ParsingError = Class.new(StandardError) +end diff --git a/lib/gitlab/prometheus/queries/additional_metrics_query.rb b/lib/gitlab/prometheus/queries/additional_metrics_query.rb new file mode 100644 index 00000000000..001701383c3 --- /dev/null +++ b/lib/gitlab/prometheus/queries/additional_metrics_query.rb @@ -0,0 +1,70 @@ +module Gitlab::Prometheus::Queries + class AdditionalMetricsQuery < BaseQuery + def self.metrics + @metrics ||= YAML.load_file(Rails.root.join('config/custom_metrics.yml')).freeze + end + + def query(environment_id) + environment = Environment.find_by(id: environment_id) + + context = { + environment_slug: environment.slug, + environment_filter: %{container_name!="POD",environment="#{environment.slug}"} + } + + timeframe_start = 8.hours.ago.to_f + timeframe_end = Time.now.to_f + + matched_metrics.map do |group| + group[:metrics].map! do |metric| + metric[:queries].map! do |query| + query = query.symbolize_keys + query[:result] = + if query.has_key?(:query_range) + client_query_range(query[:query_range] % context, start: timeframe_start, stop: timeframe_end) + else + client_query(query[:query] % context, time: timeframe_end) + end + query + end + metric + end + group + end + end + + def process_query(group, query) + result = if query.has_key?(:query_range) + client_query_range(query[:query_range] % context, start: timeframe_start, stop: timeframe_end) + else + client_query(query[:query] % context, time: timeframe_end) + end + contains_metrics = result.all? do |item| + item&.[](:values)&.any? || item&.[](:value)&.any? + end + end + + def process_result(query_result) + contains_metrics = query_result.all? do |item| + item&.[](:values)&.any? || item&.[](:value)&.any? + end + + contains_metrics + end + + def matched_metrics + label_values = client_label_values || [] + + result = Gitlab::Prometheus::MetricsSources.additional_metrics.map do |group| + group[:metrics].map!(&:symbolize_keys) + group[:metrics].select! do |metric| + matcher = Regexp.compile(metric[:detect]) + label_values.any? &matcher.method(:match) + end + group + end + + result.select {|group| !group[:metrics].empty?} + end + end +end diff --git a/lib/gitlab/prometheus/queries/base_query.rb b/lib/gitlab/prometheus/queries/base_query.rb index 2a2eb4ae57f..c60828165bd 100644 --- a/lib/gitlab/prometheus/queries/base_query.rb +++ b/lib/gitlab/prometheus/queries/base_query.rb @@ -3,7 +3,7 @@ module Gitlab module Queries class BaseQuery attr_accessor :client - delegate :query_range, :query, to: :client, prefix: true + delegate :query_range, :query, :label_values, :series, to: :client, prefix: true def raw_memory_usage_query(environment_slug) %{avg(container_memory_usage_bytes{container_name!="POD",environment="#{environment_slug}"}) / 2^20} diff --git a/lib/gitlab/prometheus/queries/matched_metrics_query.rb b/lib/gitlab/prometheus/queries/matched_metrics_query.rb new file mode 100644 index 00000000000..61926320e40 --- /dev/null +++ b/lib/gitlab/prometheus/queries/matched_metrics_query.rb @@ -0,0 +1,72 @@ +module Gitlab::Prometheus::Queries + class MatchedMetricsQuery < BaseQuery + MAX_QUERY_ITEMS = 40.freeze + + def self.metrics + @metrics ||= YAML.load_file(Rails.root.join('config/additional_metrics.yml')).map(&:deep_symbolize_keys) + end + + def query + groups_data.map do |group, data| + { + group: group.name, + priority: group.priority, + active_metrics: data[:active_metrics], + metrics_missing_requirements: data[:metrics_missing_requirements] + } + end + end + + def groups_data + metrics_series = metrics_with_series(Gitlab::Prometheus::MetricGroup.all) + lookup = active_series_lookup(metrics_series) + + groups = {} + + metrics_series.each do |metrics, series| + groups[metrics.group] ||= { active_metrics: 0, metrics_missing_requirements: 0 } + group = groups[metrics.group] + + if series.all?(&lookup.method(:has_key?)) + group[:active_metrics] += 1 + else + group[:metrics_missing_requirements] += 1 + end + group + end + + groups + end + + def active_series_lookup(metrics) + timeframe_start = 8.hours.ago + timeframe_end = Time.now + + series = metrics.flat_map { |metrics, series| series }.uniq + + lookup = series.each_slice(MAX_QUERY_ITEMS).flat_map do |batched_series| + client_series(*batched_series, start: timeframe_start, stop: timeframe_end) + .select(&method(:has_matching_label)) + .map { |series_info| [series_info['__name__'], true] } + end + lookup.to_h + end + + def has_matching_label(series_info) + series_info.has_key?('environment') + end + + def metrics_with_series(metric_groups) + label_values = client_label_values || [] + + metrics = metric_groups.flat_map do |group| + group.metrics.map do |metric| + matcher = Regexp.compile(metric.detect) + [metric, label_values.select(&matcher.method(:match))] + end + end + + metrics.select { |metric, labels| labels&.any? } + end + end +end diff --git a/lib/gitlab/prometheus_client.rb b/lib/gitlab/prometheus_client.rb index 5b51a1779dd..f4ef4ff8ba4 100644 --- a/lib/gitlab/prometheus_client.rb +++ b/lib/gitlab/prometheus_client.rb @@ -29,6 +29,14 @@ module Gitlab end end + def label_values(name='__name__') + json_api_get("label/#{name}/values") + end + + def series(*matches, start: 8.hours.ago, stop: Time.now) + json_api_get('series', 'match': matches, start: start.to_f, end: stop.to_f) + end + private def json_api_get(type, args = {}) From 61d7b7f117ff090f34f882918d55691575d76e55 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Thu, 25 May 2017 14:01:10 +0200 Subject: [PATCH 0012/1380] Finalize refactoring additional metrics query --- app/models/environment.rb | 4 +- .../project_services/prometheus_service.rb | 2 +- lib/gitlab/prometheus/metric_group.rb | 8 +- .../queries/additional_metrics_query.rb | 79 +++++++++---------- .../queries/matched_metrics_query.rb | 6 +- 5 files changed, 49 insertions(+), 50 deletions(-) diff --git a/app/models/environment.rb b/app/models/environment.rb index b4a4f74a8d5..7ab4a23ab16 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -158,7 +158,9 @@ class Environment < ActiveRecord::Base end def additional_metrics - project.monitoring_service.reactive_query(Gitlab::Prometheus::Queries::AdditionalMetricsQuery, self.id) if has_additional_metrics? + if has_additional_metrics? + project.monitoring_service.reactive_query(Gitlab::Prometheus::Queries::AdditionalMetricsQuery.name, self.id, &:itself) + end end # An environment name is not necessarily suitable for use in URLs, DNS diff --git a/app/models/project_services/prometheus_service.rb b/app/models/project_services/prometheus_service.rb index 674d485a03c..d3f43d66937 100644 --- a/app/models/project_services/prometheus_service.rb +++ b/app/models/project_services/prometheus_service.rb @@ -73,7 +73,7 @@ class PrometheusService < MonitoringService end def reactive_query(query_class, *args, &block) - calculate_reactive_cache(query_class, *args, &block) + with_reactive_cache(query_class, *args, &block) end # Cache metrics for specific environment diff --git a/lib/gitlab/prometheus/metric_group.rb b/lib/gitlab/prometheus/metric_group.rb index 093390b4fa7..9f95525bc0c 100644 --- a/lib/gitlab/prometheus/metric_group.rb +++ b/lib/gitlab/prometheus/metric_group.rb @@ -13,6 +13,10 @@ module Gitlab::Prometheus load_groups_from_yaml end + def self.load_groups_from_yaml + additional_metrics_raw.map(&method(:group_from_entry)) + end + def self.group_from_entry(entry) missing_fields = [:group, :priority, :metrics].select { |key| !entry.has_key?(key) } raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? @@ -22,10 +26,6 @@ module Gitlab::Prometheus group end - def self.load_groups_from_yaml - additional_metrics_raw.map(&method(:group_from_entry)) - end - def self.additional_metrics_raw @additional_metrics_raw ||= YAML.load_file(Rails.root.join('config/additional_metrics.yml'))&.map(&:deep_symbolize_keys).freeze end diff --git a/lib/gitlab/prometheus/queries/additional_metrics_query.rb b/lib/gitlab/prometheus/queries/additional_metrics_query.rb index 001701383c3..de0dab0b19c 100644 --- a/lib/gitlab/prometheus/queries/additional_metrics_query.rb +++ b/lib/gitlab/prometheus/queries/additional_metrics_query.rb @@ -1,47 +1,46 @@ module Gitlab::Prometheus::Queries class AdditionalMetricsQuery < BaseQuery - def self.metrics - @metrics ||= YAML.load_file(Rails.root.join('config/custom_metrics.yml')).freeze - end - def query(environment_id) - environment = Environment.find_by(id: environment_id) - - context = { - environment_slug: environment.slug, - environment_filter: %{container_name!="POD",environment="#{environment.slug}"} - } - - timeframe_start = 8.hours.ago.to_f - timeframe_end = Time.now.to_f + query_processor = method(:process_query).curry[query_context(environment_id)] matched_metrics.map do |group| - group[:metrics].map! do |metric| - metric[:queries].map! do |query| - query = query.symbolize_keys - query[:result] = - if query.has_key?(:query_range) - client_query_range(query[:query_range] % context, start: timeframe_start, stop: timeframe_end) - else - client_query(query[:query] % context, time: timeframe_end) - end - query - end - metric + metrics = group.metrics.map do |metric| + { + title: metric.title, + weight: metric.weight, + queries: metric.queries.map(&query_processor) + } end - group + + { + group: group.name, + priority: group.priority, + metrics: metrics + } end end - def process_query(group, query) - result = if query.has_key?(:query_range) - client_query_range(query[:query_range] % context, start: timeframe_start, stop: timeframe_end) - else - client_query(query[:query] % context, time: timeframe_end) - end - contains_metrics = result.all? do |item| - item&.[](:values)&.any? || item&.[](:value)&.any? - end + private + + def query_context(environment_id) + environment = Environment.find_by(id: environment_id) + { + environment_slug: environment.slug, + environment_filter: %{container_name!="POD",environment="#{environment.slug}"}, + timeframe_start: 8.hours.ago.to_f, + timeframe_end: Time.now.to_f + } + end + + def process_query(context, query) + query_with_result = query.dup + query_with_result[:result] = + if query.has_key?(:query_range) + client_query_range(query[:query_range] % context, start: context[:timeframe_start], stop: context[:timeframe_end]) + else + client_query(query[:query] % context, time: context[:timeframe_end]) + end + query_with_result end def process_result(query_result) @@ -54,17 +53,17 @@ module Gitlab::Prometheus::Queries def matched_metrics label_values = client_label_values || [] + Gitlab::Prometheus::MetricGroup.all - result = Gitlab::Prometheus::MetricsSources.additional_metrics.map do |group| - group[:metrics].map!(&:symbolize_keys) - group[:metrics].select! do |metric| - matcher = Regexp.compile(metric[:detect]) + result = Gitlab::Prometheus::MetricGroup.all.map do |group| + group.metrics.select! do |metric| + matcher = Regexp.compile(metric.detect) label_values.any? &matcher.method(:match) end group end - result.select {|group| !group[:metrics].empty?} + result.select { |group| group.metrics.any? } end end end diff --git a/lib/gitlab/prometheus/queries/matched_metrics_query.rb b/lib/gitlab/prometheus/queries/matched_metrics_query.rb index 61926320e40..5a8b0f6c701 100644 --- a/lib/gitlab/prometheus/queries/matched_metrics_query.rb +++ b/lib/gitlab/prometheus/queries/matched_metrics_query.rb @@ -2,10 +2,6 @@ module Gitlab::Prometheus::Queries class MatchedMetricsQuery < BaseQuery MAX_QUERY_ITEMS = 40.freeze - def self.metrics - @metrics ||= YAML.load_file(Rails.root.join('config/additional_metrics.yml')).map(&:deep_symbolize_keys) - end - def query groups_data.map do |group, data| { @@ -17,6 +13,8 @@ module Gitlab::Prometheus::Queries end end + private + def groups_data metrics_series = metrics_with_series(Gitlab::Prometheus::MetricGroup.all) lookup = active_series_lookup(metrics_series) From 4d8f3978a254f33d959de65dbf7b20a1d41a058d Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Thu, 25 May 2017 16:19:54 +0200 Subject: [PATCH 0013/1380] Use before action to respond with 404 if prometheus metrics are missing --- app/controllers/projects/prometheus_controller.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/controllers/projects/prometheus_controller.rb b/app/controllers/projects/prometheus_controller.rb index 74e247535d5..0402be6f85c 100644 --- a/app/controllers/projects/prometheus_controller.rb +++ b/app/controllers/projects/prometheus_controller.rb @@ -1,8 +1,8 @@ class Projects::PrometheusController < Projects::ApplicationController before_action :authorize_read_project! + before_action :require_prometheus_metrics! def active_metrics - return render_404 unless has_prometheus_metrics? matched_metrics = prometheus_service.reactive_query(Gitlab::Prometheus::Queries::MatchedMetricsQuery.name, &:itself) if matched_metrics @@ -12,6 +12,8 @@ class Projects::PrometheusController < Projects::ApplicationController end end + private + def prometheus_service project.monitoring_service end @@ -19,4 +21,8 @@ class Projects::PrometheusController < Projects::ApplicationController def has_prometheus_metrics? prometheus_service&.respond_to?(:reactive_query) end + + def require_prometheus_metrics! + render_404 unless has_prometheus_metrics? + end end From 608186d54bb9aefb0b867c177ac62d534e8840ad Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Thu, 25 May 2017 17:39:43 +0200 Subject: [PATCH 0014/1380] Add per deployment additional metrics --- .../projects/deployments_controller.rb | 11 ++++++++ app/models/deployment.rb | 10 +++++++ config/routes/project.rb | 1 + .../additional_metrics_deployment_query.rb | 17 ++++++++++++ .../queries/additional_metrics_query.rb | 26 +++++++++++-------- 5 files changed, 54 insertions(+), 11 deletions(-) create mode 100644 lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb diff --git a/app/controllers/projects/deployments_controller.rb b/app/controllers/projects/deployments_controller.rb index 6644deb49c9..29d94e2760a 100644 --- a/app/controllers/projects/deployments_controller.rb +++ b/app/controllers/projects/deployments_controller.rb @@ -22,6 +22,17 @@ class Projects::DeploymentsController < Projects::ApplicationController render_404 end + def additional_metrics + return render_404 unless deployment.has_additional_metrics? + metrics = deployment.additional_metrics + + if metrics&.any? + render json: metrics, status: :ok + else + head :no_content + end + end + private def deployment diff --git a/app/models/deployment.rb b/app/models/deployment.rb index 216cec751e3..f49410f18ae 100644 --- a/app/models/deployment.rb +++ b/app/models/deployment.rb @@ -103,12 +103,22 @@ class Deployment < ActiveRecord::Base project.monitoring_service.present? end + def has_additional_metrics? + has_metrics? && project.monitoring_service&.respond_to?(:reactive_query) + end + def metrics return {} unless has_metrics? project.monitoring_service.deployment_metrics(self) end + def additional_metrics + return {} unless has_additional_metrics? + metrics = project.monitoring_service.reactive_query(Gitlab::Prometheus::Queries::AdditionalMetricsDeploymentQuery.name, id, &:itself) + metrics&.merge(deployment_time: created_at.to_i) || {} + end + private def ref_path diff --git a/config/routes/project.rb b/config/routes/project.rb index f5d00e4e93b..89b14ef6527 100644 --- a/config/routes/project.rb +++ b/config/routes/project.rb @@ -167,6 +167,7 @@ constraints(ProjectUrlConstrainer.new) do resources :deployments, only: [:index] do member do get :metrics + get :additional_metrics end end end diff --git a/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb b/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb new file mode 100644 index 00000000000..382052c298f --- /dev/null +++ b/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb @@ -0,0 +1,17 @@ +module Gitlab::Prometheus::Queries + class AdditionalMetricsDeploymentQuery < AdditionalMetricsQuery + + def query(deployment_id) + deployment = Deployment.find_by(id: deployment_id) + query_context = { + environment_slug: deployment.environment.slug, + environment_filter: %{container_name!="POD",environment="#{deployment.environment.slug}"}, + timeframe_start: (deployment.created_at - 30.minutes).to_f, + timeframe_end: (deployment.created_at + 30.minutes).to_f + } + + query_metrics(query_context) + end + end +end + diff --git a/lib/gitlab/prometheus/queries/additional_metrics_query.rb b/lib/gitlab/prometheus/queries/additional_metrics_query.rb index de0dab0b19c..c48fcadee57 100644 --- a/lib/gitlab/prometheus/queries/additional_metrics_query.rb +++ b/lib/gitlab/prometheus/queries/additional_metrics_query.rb @@ -1,7 +1,21 @@ module Gitlab::Prometheus::Queries class AdditionalMetricsQuery < BaseQuery def query(environment_id) - query_processor = method(:process_query).curry[query_context(environment_id)] + environment = Environment.find_by(id: environment_id) + query_context = { + environment_slug: environment.slug, + environment_filter: %{container_name!="POD",environment="#{environment.slug}"}, + timeframe_start: 8.hours.ago.to_f, + timeframe_end: Time.now.to_f + } + + query_metrics(query_context) + end + + protected + + def query_metrics(query_context) + query_processor = method(:process_query).curry[query_context] matched_metrics.map do |group| metrics = group.metrics.map do |metric| @@ -22,16 +36,6 @@ module Gitlab::Prometheus::Queries private - def query_context(environment_id) - environment = Environment.find_by(id: environment_id) - { - environment_slug: environment.slug, - environment_filter: %{container_name!="POD",environment="#{environment.slug}"}, - timeframe_start: 8.hours.ago.to_f, - timeframe_end: Time.now.to_f - } - end - def process_query(context, query) query_with_result = query.dup query_with_result[:result] = From aaeda829ddb5e150be41c9dff374b2be0beab336 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Tue, 30 May 2017 13:17:13 +0200 Subject: [PATCH 0015/1380] Add Y Label field to yml and responses --- config/additional_metrics.yml | 1 + lib/gitlab/prometheus/metric.rb | 7 ++++--- lib/gitlab/prometheus/metrics_sources.rb | 7 ------- lib/gitlab/prometheus/queries/additional_metrics_query.rb | 1 + 4 files changed, 6 insertions(+), 10 deletions(-) delete mode 100644 lib/gitlab/prometheus/metrics_sources.rb diff --git a/config/additional_metrics.yml b/config/additional_metrics.yml index 209209f4b30..59ca387f055 100644 --- a/config/additional_metrics.yml +++ b/config/additional_metrics.yml @@ -2,6 +2,7 @@ priority: 1 metrics: - title: "Memory usage" + y_label: "Values" detect: container_memory_usage_bytes weight: 1 queries: diff --git a/lib/gitlab/prometheus/metric.rb b/lib/gitlab/prometheus/metric.rb index 2818afb34b0..777cf030ceb 100644 --- a/lib/gitlab/prometheus/metric.rb +++ b/lib/gitlab/prometheus/metric.rb @@ -1,12 +1,13 @@ module Gitlab::Prometheus class Metric - attr_reader :group, :title, :detect, :weight, :queries + attr_reader :group, :title, :detect, :weight, :y_label, :queries - def initialize(group, title, detect, weight, queries = []) + def initialize(group, title, detect, weight, y_label, queries = []) @group = group @title = title @detect = detect @weight = weight + @y_label = y_label || 'Values' @queries = queries end @@ -14,7 +15,7 @@ module Gitlab::Prometheus missing_fields = [:title, :detect, :weight, :queries].select { |key| !entry.has_key?(key) } raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? - Metric.new(group, entry[:title], entry[:detect], entry[:weight], entry[:queries]) + Metric.new(group, entry[:title], entry[:detect], entry[:weight], entry[:y_label],entry[:queries]) end def self.metrics_from_list(group, list) diff --git a/lib/gitlab/prometheus/metrics_sources.rb b/lib/gitlab/prometheus/metrics_sources.rb deleted file mode 100644 index 500b6e971a2..00000000000 --- a/lib/gitlab/prometheus/metrics_sources.rb +++ /dev/null @@ -1,7 +0,0 @@ -module Gitlab::Prometheus - module MetricsSources - def self.additional_metrics - @additional_metrics ||= YAML.load_file(Rails.root.join('config/additional_metrics.yml')).deep_symbolize_keys.freeze - end - end -end diff --git a/lib/gitlab/prometheus/queries/additional_metrics_query.rb b/lib/gitlab/prometheus/queries/additional_metrics_query.rb index c48fcadee57..fd7f072834d 100644 --- a/lib/gitlab/prometheus/queries/additional_metrics_query.rb +++ b/lib/gitlab/prometheus/queries/additional_metrics_query.rb @@ -22,6 +22,7 @@ module Gitlab::Prometheus::Queries { title: metric.title, weight: metric.weight, + y_label: metric.y_label, queries: metric.queries.map(&query_processor) } end From 9ccda901271eb755cf37f37831f6beef83ed7037 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Tue, 30 May 2017 15:25:05 +0200 Subject: [PATCH 0016/1380] Add Prometheus client tests --- spec/lib/gitlab/prometheus_client_spec.rb | 30 +++++++++++++++ spec/support/prometheus_helpers.rb | 46 +++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/spec/lib/gitlab/prometheus_client_spec.rb b/spec/lib/gitlab/prometheus_client_spec.rb index 2d8bd2f6b97..46eaadae206 100644 --- a/spec/lib/gitlab/prometheus_client_spec.rb +++ b/spec/lib/gitlab/prometheus_client_spec.rb @@ -119,6 +119,36 @@ describe Gitlab::PrometheusClient, lib: true do end end + describe '#series' do + let(:query_url) { prometheus_series_url('series_name', 'other_service') } + + around do |example| + Timecop.freeze { example.run } + end + + it 'calls endpoint and returns list of series' do + req_stub = stub_prometheus_request(query_url, body: prometheus_series('series_name')) + expected = prometheus_series('series_name').deep_stringify_keys['data'] + + expect(subject.series('series_name', 'other_service')).to eq(expected) + + expect(req_stub).to have_been_requested + end + end + + describe '#label_values' do + let(:query_url) { prometheus_label_values_url('__name__') } + + it 'calls endpoint and returns label values' do + req_stub = stub_prometheus_request(query_url, body: prometheus_label_values) + expected = prometheus_label_values.deep_stringify_keys['data'] + + expect(subject.label_values('__name__')).to eq(expected) + + expect(req_stub).to have_been_requested + end + end + describe '#query_range' do let(:prometheus_query) { prometheus_memory_query('env-slug') } let(:query_url) { prometheus_query_range_url(prometheus_query) } diff --git a/spec/support/prometheus_helpers.rb b/spec/support/prometheus_helpers.rb index 6b9ebcf2bb3..e49902475da 100644 --- a/spec/support/prometheus_helpers.rb +++ b/spec/support/prometheus_helpers.rb @@ -36,6 +36,19 @@ module PrometheusHelpers "https://prometheus.example.com/api/v1/query_range?#{query}" end + def prometheus_label_values_url(name) + "https://prometheus.example.com/api/v1/label/#{name}/values" + end + + def prometheus_series_url(*matches, start: 8.hours.ago, stop: Time.now) + query = { + match: matches, + start: start.to_f, + end: stop.to_f + }.to_query + "https://prometheus.example.com/api/v1/series?#{query}" + end + def stub_prometheus_request(url, body: {}, status: 200) WebMock.stub_request(:get, url) .to_return({ @@ -140,4 +153,37 @@ module PrometheusHelpers } } end + + def prometheus_label_values + { + 'status': 'success', + 'data': %w(job_adds job_controller_rate_limiter_use job_depth job_queue_latency job_work_duration_sum up) + } + end + + def prometheus_series(name) + { + 'status': 'success', + 'data': [ + { + '__name__': name, + 'container_name': 'gitlab', + 'environment': 'mattermost', + 'id': '/docker/9953982f95cf5010dfc59d7864564d5f188aaecddeda343699783009f89db667', + 'image': 'gitlab/gitlab-ce:8.15.4-ce.1', + 'instance': 'minikube', + 'job': 'kubernetes-nodes', + 'name': 'k8s_gitlab.e6611886_mattermost-4210310111-77z8r_gitlab_2298ae6b-da24-11e6-baee-8e7f67d0eb3a_43536cb6', + 'namespace': 'gitlab', + 'pod_name': 'mattermost-4210310111-77z8r' + }, + { + '__name__': name, + 'id': '/docker', + 'instance': 'minikube', + 'job': 'kubernetes-nodes' + } + ] + } + end end From efb264f70d943196f94132655a50d73fc416f9dc Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Fri, 26 May 2017 19:53:48 +0530 Subject: [PATCH 0017/1380] Empty state icon for Metrics --- app/views/shared/icons/_icon_empty_metrics.svg | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 app/views/shared/icons/_icon_empty_metrics.svg diff --git a/app/views/shared/icons/_icon_empty_metrics.svg b/app/views/shared/icons/_icon_empty_metrics.svg new file mode 100644 index 00000000000..24fa353f3ba --- /dev/null +++ b/app/views/shared/icons/_icon_empty_metrics.svg @@ -0,0 +1,5 @@ + + + + + From 2e302e35e798ae171e08c08b81092e12c34dcfc7 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Fri, 26 May 2017 19:54:10 +0530 Subject: [PATCH 0018/1380] Prometheus Metrics Panel View --- .../services/prometheus/_show.html.haml | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 app/views/projects/services/prometheus/_show.html.haml diff --git a/app/views/projects/services/prometheus/_show.html.haml b/app/views/projects/services/prometheus/_show.html.haml new file mode 100644 index 00000000000..70f53bffe58 --- /dev/null +++ b/app/views/projects/services/prometheus/_show.html.haml @@ -0,0 +1,21 @@ +.row.prepend-top-default.append-bottom-default.prometheus-metrics-monitoring + .col-lg-3 + %h4.prepend-top-0 + Metrics + %p + Metrics are automatically configured and monitored + based on a library of metrics from popular exporters. + More information + + .col-lg-9 + .panel.panel-default + .panel-heading + %h3.panel-title + Monitored + %span.badge-count.js-monitored-count 0 + .panel-body + .empty-metrics + = custom_icon('icon_empty_metrics') + %p No metrics are being monitored. To start monitoring, deploy to an environment. + = link_to project_environments_path(@project), title: 'View environments', class: 'btn btn-success' do + View environments \ No newline at end of file From 7cef07c948db4aa61ec948ab227c4d42438b87fc Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Fri, 26 May 2017 19:55:14 +0530 Subject: [PATCH 0019/1380] Render service extras partial conditionally --- app/views/projects/services/_form.html.haml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml index f1a80f1d5e1..f9ce81b729f 100644 --- a/app/views/projects/services/_form.html.haml +++ b/app/views/projects/services/_form.html.haml @@ -18,3 +18,7 @@ = link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service), class: "btn #{disabled_class}", title: disabled_title = link_to "Cancel", namespace_project_settings_integrations_path(@project.namespace, @project), class: "btn btn-cancel" + +- if lookup_context.template_exists?('show', "projects/services/#{@service.to_param}", true) + %hr + = render "projects/services/#{@service.to_param}/show" \ No newline at end of file From 33fe2af4a3cfe0d1f1b93b8c6546f796cde141f2 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Fri, 26 May 2017 19:55:37 +0530 Subject: [PATCH 0020/1380] Add styles for Prometheus Metrics panel --- app/assets/stylesheets/pages/settings.scss | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/app/assets/stylesheets/pages/settings.scss b/app/assets/stylesheets/pages/settings.scss index 3889deee21a..e1ee566c3a1 100644 --- a/app/assets/stylesheets/pages/settings.scss +++ b/app/assets/stylesheets/pages/settings.scss @@ -35,3 +35,28 @@ margin-left: 5px; } } + +.prometheus-metrics-monitoring { + .panel { + .panel-heading .badge-count { + padding: 3px 8px; + color: $white-light; + background: $common-gray-dark; + border-radius: 40%; + } + } + + .empty-metrics { + text-align: center; + padding: 20px 10px; + + p, + .btn { + margin-top: 10px; + } + + p { + color: $gl-gray-light; + } + } +} \ No newline at end of file From 2559a880eebd2b8beb0a29bad6ab9948dca0c010 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Wed, 31 May 2017 17:08:22 +0530 Subject: [PATCH 0021/1380] Prometheus Metrics Bundle --- .../javascripts/prometheus_metrics/index.js | 7 ++ .../prometheus_metrics/prometheus_metrics.js | 75 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 app/assets/javascripts/prometheus_metrics/index.js create mode 100644 app/assets/javascripts/prometheus_metrics/prometheus_metrics.js diff --git a/app/assets/javascripts/prometheus_metrics/index.js b/app/assets/javascripts/prometheus_metrics/index.js new file mode 100644 index 00000000000..9f20161783b --- /dev/null +++ b/app/assets/javascripts/prometheus_metrics/index.js @@ -0,0 +1,7 @@ +import PrometheusMetrics from './prometheus_metrics'; + +$(() => { + const prometheusMetrics = new PrometheusMetrics('.js-prometheus-metrics-monitoring'); + prometheusMetrics.init(); + prometheusMetrics.loadActiveMetrics(); +}); diff --git a/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js b/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js new file mode 100644 index 00000000000..0dc6f7727a2 --- /dev/null +++ b/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js @@ -0,0 +1,75 @@ +/* eslint-disable class-methods-use-this, promise/catch-or-return */ + +export default class PrometheusMetrics { + constructor(wrapperSelector) { + this.backOffRequestCounter = 0; + + this.$wrapper = $(wrapperSelector); + + this.$monitoredMetricsPanel = this.$wrapper.find('.js-panel-monitored-metrics'); + this.$monitoredMetricsCount = this.$monitoredMetricsPanel.find('.js-monitored-count'); + this.$monitoredMetricsLoading = this.$monitoredMetricsPanel.find('.js-loading-metrics'); + this.$monitoredMetricsEmpty = this.$monitoredMetricsPanel.find('.js-empty-metrics'); + this.$monitoredMetricsList = this.$monitoredMetricsPanel.find('.js-metrics-list'); + + this.$panelToggle = this.$wrapper.find('.js-panel-toggle'); + + this.activeMetricsEndpoint = this.$monitoredMetricsPanel.data('active-metrics'); + } + + init() { + this.$panelToggle.on('click', e => this.handlePanelToggle(e)); + } + + handlePanelToggle(e) { + const $toggleBtn = $(e.currentTarget); + const $currentPanelBody = $toggleBtn.parents('.panel').find('.panel-body'); + if ($currentPanelBody.is(':visible')) { + $currentPanelBody.addClass('hidden'); + $toggleBtn.removeClass('fa-caret-down').addClass('fa-caret-right'); + } else { + $currentPanelBody.removeClass('hidden'); + $toggleBtn.removeClass('fa-caret-right').addClass('fa-caret-down'); + } + } + + populateActiveMetrics(metrics) { + let totalMonitoredMetrics = 0; + metrics.forEach((metric) => { + this.$monitoredMetricsList.append(`
  • ${metric.group}${metric.active_metrics}
  • `); + totalMonitoredMetrics += metric.active_metrics; + }); + + this.$monitoredMetricsCount.text(totalMonitoredMetrics); + this.$monitoredMetricsLoading.addClass('hidden'); + this.$monitoredMetricsList.removeClass('hidden'); + } + + loadActiveMetrics() { + this.$monitoredMetricsLoading.removeClass('hidden'); + gl.utils.backOff((next, stop) => { + $.getJSON(this.activeMetricsEndpoint) + .done((res) => { + if (res && res.success) { + stop(res); + } else { + this.backOffRequestCounter = this.backOffRequestCounter += 1; + if (this.backOffRequestCounter < 3) { + next(); + } else { + stop(res); + } + } + }) + .fail(stop); + }) + .then((res) => { + if (res && res.data && res.data.length) { + this.populateActiveMetrics(res.data); + } else { + this.$monitoredMetricsLoading.addClass('hidden'); + this.$monitoredMetricsEmpty.removeClass('hidden'); + } + }); + } +} From 2742bbd22c6f2330d87b631d7be25f1d7549a1d8 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Wed, 31 May 2017 17:08:41 +0530 Subject: [PATCH 0022/1380] Add Prometheus Metrics Bundle --- config/webpack.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/config/webpack.config.js b/config/webpack.config.js index c77b1d6334c..38769f3f625 100644 --- a/config/webpack.config.js +++ b/config/webpack.config.js @@ -51,6 +51,7 @@ var config = { pipelines: './pipelines/index.js', pipelines_details: './pipelines/pipeline_details_bundle.js', profile: './profile/profile_bundle.js', + prometheus_metrics: './prometheus_metrics', protected_branches: './protected_branches/protected_branches_bundle.js', protected_tags: './protected_tags', sidebar: './sidebar/sidebar_bundle.js', From 15908cf29099b994b4495ac864446ef2045d254c Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Wed, 31 May 2017 17:09:21 +0530 Subject: [PATCH 0023/1380] Add Prometheus Metrics Bundle, panel for Missing environment variables --- .../services/prometheus/_show.html.haml | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/app/views/projects/services/prometheus/_show.html.haml b/app/views/projects/services/prometheus/_show.html.haml index 70f53bffe58..2f0f539560a 100644 --- a/app/views/projects/services/prometheus/_show.html.haml +++ b/app/views/projects/services/prometheus/_show.html.haml @@ -1,4 +1,7 @@ -.row.prepend-top-default.append-bottom-default.prometheus-metrics-monitoring +- content_for :page_specific_javascripts do + = webpack_bundle_tag('prometheus_metrics') + +.row.prepend-top-default.append-bottom-default.prometheus-metrics-monitoring.js-prometheus-metrics-monitoring .col-lg-3 %h4.prepend-top-0 Metrics @@ -8,14 +11,28 @@ More information .col-lg-9 - .panel.panel-default + .panel.panel-default.js-panel-monitored-metrics{ data: { "active-metrics" => "#{namespace_project_prometheus_active_metrics_path(@project.namespace, @project)}.json" } } .panel-heading %h3.panel-title Monitored %span.badge-count.js-monitored-count 0 .panel-body - .empty-metrics + .loading-metrics.js-loading-metrics + = icon('spinner spin 3x') + %p Finding and configuring metrics... + .empty-metrics.hidden.js-empty-metrics = custom_icon('icon_empty_metrics') %p No metrics are being monitored. To start monitoring, deploy to an environment. = link_to project_environments_path(@project), title: 'View environments', class: 'btn btn-success' do - View environments \ No newline at end of file + View environments + %ul.metrics-list.hidden.js-metrics-list + + .panel.panel-default.js-panel-missing-env-vars + .panel-heading + %h3.panel-title + = icon('caret-right lg', class: 'panel-toggle js-panel-toggle', 'aria-label' => 'Toggle panel') + Missing environment variable(s) + %span.badge-count.js-env-var-count 0 + .panel-body.hidden + .empty-metrics + %p Nothing to show here at the moment \ No newline at end of file From a2b68693a86493150a68719376cdc990ad93267a Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Wed, 31 May 2017 17:09:42 +0530 Subject: [PATCH 0024/1380] Add styles for Prometheus Service Metrics --- app/assets/stylesheets/pages/settings.scss | 38 +++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/pages/settings.scss b/app/assets/stylesheets/pages/settings.scss index e1ee566c3a1..3ce17d64182 100644 --- a/app/assets/stylesheets/pages/settings.scss +++ b/app/assets/stylesheets/pages/settings.scss @@ -38,14 +38,31 @@ .prometheus-metrics-monitoring { .panel { + .panel-toggle { + width: 12px; + + &.fa-caret-right { + padding-left: 4px; + } + } + .panel-heading .badge-count { - padding: 3px 8px; color: $white-light; background: $common-gray-dark; + } + + .panel-body { + padding: 0; + } + + .badge-count { + margin-left: 3px; + padding: 3px 8px; border-radius: 40%; } } + .loading-metrics, .empty-metrics { text-align: center; padding: 20px 10px; @@ -59,4 +76,23 @@ color: $gl-gray-light; } } + + .metrics-list { + list-style-type: none; + margin: 0; + padding: 0; + + li { + padding: 15px 10px; + + .badge-count { + background: $badge-bg; + } + } + + /* Ensure we don't add border if there's only single li */ + li + li { + border-top: 1px solid $border-color; + } + } } \ No newline at end of file From a57e6a8b760d79a0a2adca8cce0547928599e3cb Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Wed, 31 May 2017 17:10:03 +0530 Subject: [PATCH 0025/1380] Add support for Prometheus Service --- spec/factories/services.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/factories/services.rb b/spec/factories/services.rb index 3fad4d2d658..412dd82c929 100644 --- a/spec/factories/services.rb +++ b/spec/factories/services.rb @@ -25,6 +25,14 @@ FactoryGirl.define do }) end + factory :prometheus_service do + project factory: :empty_project + active true + properties({ + api_url: 'https://prometheus.example.com/' + }) + end + factory :jira_service do project factory: :empty_project active true From c3c644c722dc2f0887067dbba68e43d91e610f62 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Wed, 31 May 2017 17:10:30 +0530 Subject: [PATCH 0026/1380] Prometheus Service Fixture Generator --- .../fixtures/prometheus_service.rb | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 spec/javascripts/fixtures/prometheus_service.rb diff --git a/spec/javascripts/fixtures/prometheus_service.rb b/spec/javascripts/fixtures/prometheus_service.rb new file mode 100644 index 00000000000..7dfbf885fbd --- /dev/null +++ b/spec/javascripts/fixtures/prometheus_service.rb @@ -0,0 +1,31 @@ +require 'spec_helper' + +describe Projects::ServicesController, '(JavaScript fixtures)', type: :controller do + include JavaScriptFixturesHelpers + + let(:admin) { create(:admin) } + let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} + let(:project) { create(:project_empty_repo, namespace: namespace, path: 'services-project') } + let!(:service) { create(:prometheus_service, project: project) } + + + render_views + + before(:all) do + clean_frontend_fixtures('services/') + end + + before(:each) do + sign_in(admin) + end + + it 'services/prometheus_service.html.raw' do |example| + get :edit, + namespace_id: namespace, + project_id: project, + id: service.to_param + + expect(response).to be_success + store_frontend_fixture(response, example.description) + end +end From 5cccbde4c66eaf22fc45da5a8d87a3f05552ecc7 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Wed, 31 May 2017 19:05:26 +0530 Subject: [PATCH 0027/1380] Populate Missing env var panel --- .../prometheus_metrics/prometheus_metrics.js | 16 +++++++++++++++- .../projects/services/prometheus/_show.html.haml | 15 +++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js b/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js index 0dc6f7727a2..b44fdcc9dc4 100644 --- a/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js +++ b/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js @@ -12,7 +12,10 @@ export default class PrometheusMetrics { this.$monitoredMetricsEmpty = this.$monitoredMetricsPanel.find('.js-empty-metrics'); this.$monitoredMetricsList = this.$monitoredMetricsPanel.find('.js-metrics-list'); - this.$panelToggle = this.$wrapper.find('.js-panel-toggle'); + this.$missingEnvVarPanel = this.$wrapper.find('.js-panel-missing-env-vars'); + this.$panelToggle = this.$missingEnvVarPanel.find('.js-panel-toggle'); + this.$missingEnvVarMetricCount = this.$missingEnvVarPanel.find('.js-env-var-count'); + this.$missingEnvVarMetricsList = this.$missingEnvVarPanel.find('.js-missing-var-metrics-list'); this.activeMetricsEndpoint = this.$monitoredMetricsPanel.data('active-metrics'); } @@ -35,14 +38,25 @@ export default class PrometheusMetrics { populateActiveMetrics(metrics) { let totalMonitoredMetrics = 0; + let totalMissingEnvVarMetrics = 0; + metrics.forEach((metric) => { this.$monitoredMetricsList.append(`
  • ${metric.group}${metric.active_metrics}
  • `); totalMonitoredMetrics += metric.active_metrics; + if (metric.metrics_missing_requirements > 0) { + this.$missingEnvVarMetricsList.append(`
  • ${metric.group}
  • `); + totalMissingEnvVarMetrics += 1; + } }); this.$monitoredMetricsCount.text(totalMonitoredMetrics); this.$monitoredMetricsLoading.addClass('hidden'); this.$monitoredMetricsList.removeClass('hidden'); + + if (totalMissingEnvVarMetrics > 0) { + this.$missingEnvVarPanel.removeClass('hidden'); + this.$missingEnvVarMetricCount.text(totalMissingEnvVarMetrics); + } } loadActiveMetrics() { diff --git a/app/views/projects/services/prometheus/_show.html.haml b/app/views/projects/services/prometheus/_show.html.haml index 2f0f539560a..3192116d128 100644 --- a/app/views/projects/services/prometheus/_show.html.haml +++ b/app/views/projects/services/prometheus/_show.html.haml @@ -8,7 +8,7 @@ %p Metrics are automatically configured and monitored based on a library of metrics from popular exporters. - More information + = link_to 'More information', '#' .col-lg-9 .panel.panel-default.js-panel-monitored-metrics{ data: { "active-metrics" => "#{namespace_project_prometheus_active_metrics_path(@project.namespace, @project)}.json" } } @@ -27,12 +27,19 @@ View environments %ul.metrics-list.hidden.js-metrics-list - .panel.panel-default.js-panel-missing-env-vars + .panel.panel-default.hidden.js-panel-missing-env-vars .panel-heading %h3.panel-title = icon('caret-right lg', class: 'panel-toggle js-panel-toggle', 'aria-label' => 'Toggle panel') Missing environment variable(s) %span.badge-count.js-env-var-count 0 .panel-body.hidden - .empty-metrics - %p Nothing to show here at the moment \ No newline at end of file + .flash-container + .flash-notice + .flash-text + To set up automatic monitoring, add the environment variable + %code + $CI_ENVIRONMENT_SLUG + to exporter's queries. + = link_to 'More information', '#' + %ul.metrics-list.js-missing-var-metrics-list \ No newline at end of file From b4b16212d9c17231f843db1b59caa5d086490860 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Wed, 31 May 2017 19:05:54 +0530 Subject: [PATCH 0028/1380] Styles for banner within panel --- app/assets/stylesheets/pages/settings.scss | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/assets/stylesheets/pages/settings.scss b/app/assets/stylesheets/pages/settings.scss index 3ce17d64182..7c35690f584 100644 --- a/app/assets/stylesheets/pages/settings.scss +++ b/app/assets/stylesheets/pages/settings.scss @@ -60,6 +60,14 @@ padding: 3px 8px; border-radius: 40%; } + + .flash-container { + margin-bottom: 0; + + .flash-notice { + border-radius: 0; + } + } } .loading-metrics, From 85b6b9b6aa3f76bd7e6ea764a49829afbfba9de8 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Wed, 31 May 2017 20:17:31 +0530 Subject: [PATCH 0029/1380] Lint: Fix missing new line at EOF --- app/assets/stylesheets/pages/settings.scss | 2 +- app/views/projects/services/_form.html.haml | 2 +- app/views/projects/services/prometheus/_show.html.haml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/pages/settings.scss b/app/assets/stylesheets/pages/settings.scss index 7c35690f584..7c99eef3406 100644 --- a/app/assets/stylesheets/pages/settings.scss +++ b/app/assets/stylesheets/pages/settings.scss @@ -103,4 +103,4 @@ border-top: 1px solid $border-color; } } -} \ No newline at end of file +} diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml index f9ce81b729f..a9013701591 100644 --- a/app/views/projects/services/_form.html.haml +++ b/app/views/projects/services/_form.html.haml @@ -21,4 +21,4 @@ - if lookup_context.template_exists?('show', "projects/services/#{@service.to_param}", true) %hr - = render "projects/services/#{@service.to_param}/show" \ No newline at end of file + = render "projects/services/#{@service.to_param}/show" diff --git a/app/views/projects/services/prometheus/_show.html.haml b/app/views/projects/services/prometheus/_show.html.haml index 3192116d128..bf8bfe4ddcb 100644 --- a/app/views/projects/services/prometheus/_show.html.haml +++ b/app/views/projects/services/prometheus/_show.html.haml @@ -42,4 +42,4 @@ $CI_ENVIRONMENT_SLUG to exporter's queries. = link_to 'More information', '#' - %ul.metrics-list.js-missing-var-metrics-list \ No newline at end of file + %ul.metrics-list.js-missing-var-metrics-list From b83a40483ad5f87b3e08c3ed2d090b5d87bdac27 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Thu, 1 Jun 2017 13:25:16 +0530 Subject: [PATCH 0030/1380] Remove service help, add URL field help --- app/models/project_services/prometheus_service.rb | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/app/models/project_services/prometheus_service.rb b/app/models/project_services/prometheus_service.rb index d3f43d66937..d4d6611fd3b 100644 --- a/app/models/project_services/prometheus_service.rb +++ b/app/models/project_services/prometheus_service.rb @@ -28,17 +28,6 @@ class PrometheusService < MonitoringService 'Prometheus monitoring' end - def help - <<-MD.strip_heredoc - Retrieves the Kubernetes node metrics `container_cpu_usage_seconds_total` - and `container_memory_usage_bytes` from the configured Prometheus server. - - If you are not using [Auto-Deploy](https://docs.gitlab.com/ee/ci/autodeploy/index.html) - or have set up your own Prometheus server, an `environment` label is required on each metric to - [identify the Environment](https://docs.gitlab.com/ce/user/project/integrations/prometheus.html#metrics-and-labels). - MD - end - def self.to_param 'prometheus' end @@ -49,7 +38,8 @@ class PrometheusService < MonitoringService type: 'text', name: 'api_url', title: 'API URL', - placeholder: 'Prometheus API Base URL, like http://prometheus.example.com/' + placeholder: 'Prometheus API Base URL, like http://prometheus.example.com/', + help: 'By default, Prometheus listens on ‘http://localhost:9090’. It’s not recommended to change the default address and port as this might affect or conflict with other services running on the GitLab server.' } ] end From 4826ae074f2757e2ca7cddbb201688a11bcf8f8b Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Thu, 1 Jun 2017 13:25:48 +0530 Subject: [PATCH 0031/1380] Changes based on UX review --- app/assets/stylesheets/pages/settings.scss | 9 +++++++-- app/views/projects/services/prometheus/_show.html.haml | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/pages/settings.scss b/app/assets/stylesheets/pages/settings.scss index 7c99eef3406..deed4501399 100644 --- a/app/assets/stylesheets/pages/settings.scss +++ b/app/assets/stylesheets/pages/settings.scss @@ -73,11 +73,12 @@ .loading-metrics, .empty-metrics { text-align: center; - padding: 20px 10px; + padding: 30px 10px; p, .btn { margin-top: 10px; + margin-bottom: 0; } p { @@ -85,13 +86,17 @@ } } + .loading-metrics .fa-spin { + color: $loading-color; + } + .metrics-list { list-style-type: none; margin: 0; padding: 0; li { - padding: 15px 10px; + padding: 16px; .badge-count { background: $badge-bg; diff --git a/app/views/projects/services/prometheus/_show.html.haml b/app/views/projects/services/prometheus/_show.html.haml index bf8bfe4ddcb..82d4dd2488f 100644 --- a/app/views/projects/services/prometheus/_show.html.haml +++ b/app/views/projects/services/prometheus/_show.html.haml @@ -31,7 +31,7 @@ .panel-heading %h3.panel-title = icon('caret-right lg', class: 'panel-toggle js-panel-toggle', 'aria-label' => 'Toggle panel') - Missing environment variable(s) + Missing environment variable %span.badge-count.js-env-var-count 0 .panel-body.hidden .flash-container @@ -40,6 +40,6 @@ To set up automatic monitoring, add the environment variable %code $CI_ENVIRONMENT_SLUG - to exporter's queries. + to exporter’s queries. = link_to 'More information', '#' %ul.metrics-list.js-missing-var-metrics-list From afc1a67d19c077bc61350a01d6a0f7e676e5a0f6 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Thu, 1 Jun 2017 15:05:15 +0530 Subject: [PATCH 0032/1380] Handle response failure case for loadActiveMetrics --- .../javascripts/prometheus_metrics/prometheus_metrics.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js b/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js index b44fdcc9dc4..d83e85b2026 100644 --- a/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js +++ b/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js @@ -1,5 +1,3 @@ -/* eslint-disable class-methods-use-this, promise/catch-or-return */ - export default class PrometheusMetrics { constructor(wrapperSelector) { this.backOffRequestCounter = 0; @@ -24,6 +22,7 @@ export default class PrometheusMetrics { this.$panelToggle.on('click', e => this.handlePanelToggle(e)); } + /* eslint-disable class-methods-use-this */ handlePanelToggle(e) { const $toggleBtn = $(e.currentTarget); const $currentPanelBody = $toggleBtn.parents('.panel').find('.panel-body'); @@ -84,6 +83,10 @@ export default class PrometheusMetrics { this.$monitoredMetricsLoading.addClass('hidden'); this.$monitoredMetricsEmpty.removeClass('hidden'); } + }) + .catch(() => { + this.$monitoredMetricsLoading.addClass('hidden'); + this.$monitoredMetricsEmpty.removeClass('hidden'); }); } } From 4c58fd82df71e1a8a4389cbbb8a5ea3b0186291c Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Thu, 1 Jun 2017 15:05:27 +0530 Subject: [PATCH 0033/1380] Tests for `PrometheusMetrics` class --- .../prometheus_metrics/mock_data.js | 41 ++++++ .../prometheus_metrics_spec.js | 125 ++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 spec/javascripts/prometheus_metrics/mock_data.js create mode 100644 spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js diff --git a/spec/javascripts/prometheus_metrics/mock_data.js b/spec/javascripts/prometheus_metrics/mock_data.js new file mode 100644 index 00000000000..3af56df92e2 --- /dev/null +++ b/spec/javascripts/prometheus_metrics/mock_data.js @@ -0,0 +1,41 @@ +export const metrics = [ + { + group: 'Kubernetes', + priority: 1, + active_metrics: 4, + metrics_missing_requirements: 0, + }, + { + group: 'HAProxy', + priority: 2, + active_metrics: 3, + metrics_missing_requirements: 0, + }, + { + group: 'Apache', + priority: 3, + active_metrics: 5, + metrics_missing_requirements: 0, + }, +]; + +export const missingVarMetrics = [ + { + group: 'Kubernetes', + priority: 1, + active_metrics: 4, + metrics_missing_requirements: 0, + }, + { + group: 'HAProxy', + priority: 2, + active_metrics: 3, + metrics_missing_requirements: 1, + }, + { + group: 'Apache', + priority: 3, + active_metrics: 5, + metrics_missing_requirements: 3, + }, +]; diff --git a/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js b/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js new file mode 100644 index 00000000000..8b4f386af80 --- /dev/null +++ b/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js @@ -0,0 +1,125 @@ +import PrometheusMetrics from '~/prometheus_metrics/prometheus_metrics'; +import { metrics, missingVarMetrics } from './mock_data'; + +describe('PrometheusMetrics', () => { + const FIXTURE = 'services/prometheus_service.html.raw'; + preloadFixtures(FIXTURE); + + beforeEach(() => { + loadFixtures(FIXTURE); + }); + + describe('constructor', () => { + let prometheusMetrics; + + beforeEach(() => { + prometheusMetrics = new PrometheusMetrics('.js-prometheus-metrics-monitoring'); + }); + + it('should initialize wrapper element refs on class object', () => { + expect(prometheusMetrics.$wrapper).toBeDefined(); + expect(prometheusMetrics.$monitoredMetricsPanel).toBeDefined(); + expect(prometheusMetrics.$monitoredMetricsCount).toBeDefined(); + expect(prometheusMetrics.$monitoredMetricsLoading).toBeDefined(); + expect(prometheusMetrics.$monitoredMetricsEmpty).toBeDefined(); + expect(prometheusMetrics.$monitoredMetricsList).toBeDefined(); + expect(prometheusMetrics.$missingEnvVarPanel).toBeDefined(); + expect(prometheusMetrics.$panelToggle).toBeDefined(); + expect(prometheusMetrics.$missingEnvVarMetricCount).toBeDefined(); + expect(prometheusMetrics.$missingEnvVarMetricsList).toBeDefined(); + }); + + it('should initialize metadata on class object', () => { + expect(prometheusMetrics.backOffRequestCounter).toEqual(0); + expect(prometheusMetrics.activeMetricsEndpoint).toContain('/test'); + }); + }); + + describe('populateActiveMetrics', () => { + let prometheusMetrics; + + beforeEach(() => { + prometheusMetrics = new PrometheusMetrics('.js-prometheus-metrics-monitoring'); + }); + + it('should show monitored metrics list', () => { + prometheusMetrics.populateActiveMetrics(metrics); + + const $metricsListLi = prometheusMetrics.$monitoredMetricsList.find('li'); + + expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBeTruthy(); + expect(prometheusMetrics.$monitoredMetricsList.hasClass('hidden')).toBeFalsy(); + + expect(prometheusMetrics.$monitoredMetricsCount.text()).toEqual('12'); + expect($metricsListLi.length).toEqual(metrics.length); + expect($metricsListLi.first().find('.badge-count').text()).toEqual(`${metrics[0].active_metrics}`); + }); + + it('should show missing environment variables list', () => { + prometheusMetrics.populateActiveMetrics(missingVarMetrics); + + expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBeTruthy(); + expect(prometheusMetrics.$missingEnvVarPanel.hasClass('hidden')).toBeFalsy(); + + expect(prometheusMetrics.$missingEnvVarMetricCount.text()).toEqual('2'); + expect(prometheusMetrics.$missingEnvVarPanel.find('li').length).toEqual(2); + expect(prometheusMetrics.$missingEnvVarPanel.find('.flash-container')).toBeDefined(); + }); + }); + + describe('loadActiveMetrics', () => { + let prometheusMetrics; + + beforeEach(() => { + prometheusMetrics = new PrometheusMetrics('.js-prometheus-metrics-monitoring'); + }); + + it('should show loader animation while response is being loaded and hide it when request is complete', (done) => { + const deferred = $.Deferred(); + spyOn($, 'getJSON').and.returnValue(deferred.promise()); + + prometheusMetrics.loadActiveMetrics(); + + expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBeFalsy(); + expect($.getJSON).toHaveBeenCalledWith(prometheusMetrics.activeMetricsEndpoint); + + deferred.resolve({ data: metrics, success: true }); + + setTimeout(() => { + expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBeTruthy(); + done(); + }); + }); + + it('should show empty state if response failed to load', (done) => { + const deferred = $.Deferred(); + spyOn($, 'getJSON').and.returnValue(deferred.promise()); + spyOn(prometheusMetrics, 'populateActiveMetrics'); + + prometheusMetrics.loadActiveMetrics(); + + deferred.reject(); + + setTimeout(() => { + expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBeTruthy(); + expect(prometheusMetrics.$monitoredMetricsEmpty.hasClass('hidden')).toBeFalsy(); + done(); + }); + }); + + it('should populate metrics list once response is loaded', (done) => { + const deferred = $.Deferred(); + spyOn($, 'getJSON').and.returnValue(deferred.promise()); + spyOn(prometheusMetrics, 'populateActiveMetrics'); + + prometheusMetrics.loadActiveMetrics(); + + deferred.resolve({ data: metrics, success: true }); + + setTimeout(() => { + expect(prometheusMetrics.populateActiveMetrics).toHaveBeenCalledWith(metrics); + done(); + }); + }); + }); +}); From 3f0eff82592f4a30abb6ffd15ac248a5f773c994 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Thu, 1 Jun 2017 21:24:56 +0530 Subject: [PATCH 0034/1380] Update as per review feedback --- .../prometheus_metrics/constants.js | 5 +++ .../javascripts/prometheus_metrics/index.js | 1 - .../prometheus_metrics/prometheus_metrics.js | 45 +++++++++++++------ app/assets/stylesheets/pages/settings.scss | 30 +++++-------- .../services/prometheus/_show.html.haml | 14 +++--- .../prometheus_metrics_spec.js | 35 ++++++++++++++- 6 files changed, 87 insertions(+), 43 deletions(-) create mode 100644 app/assets/javascripts/prometheus_metrics/constants.js diff --git a/app/assets/javascripts/prometheus_metrics/constants.js b/app/assets/javascripts/prometheus_metrics/constants.js new file mode 100644 index 00000000000..50f1248456e --- /dev/null +++ b/app/assets/javascripts/prometheus_metrics/constants.js @@ -0,0 +1,5 @@ +export default { + EMPTY: 'empty', + LOADING: 'loading', + LIST: 'list', +}; diff --git a/app/assets/javascripts/prometheus_metrics/index.js b/app/assets/javascripts/prometheus_metrics/index.js index 9f20161783b..a0c43c5abe1 100644 --- a/app/assets/javascripts/prometheus_metrics/index.js +++ b/app/assets/javascripts/prometheus_metrics/index.js @@ -2,6 +2,5 @@ import PrometheusMetrics from './prometheus_metrics'; $(() => { const prometheusMetrics = new PrometheusMetrics('.js-prometheus-metrics-monitoring'); - prometheusMetrics.init(); prometheusMetrics.loadActiveMetrics(); }); diff --git a/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js b/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js index d83e85b2026..ef4d6df5138 100644 --- a/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js +++ b/app/assets/javascripts/prometheus_metrics/prometheus_metrics.js @@ -1,3 +1,5 @@ +import PANEL_STATE from './constants'; + export default class PrometheusMetrics { constructor(wrapperSelector) { this.backOffRequestCounter = 0; @@ -16,31 +18,48 @@ export default class PrometheusMetrics { this.$missingEnvVarMetricsList = this.$missingEnvVarPanel.find('.js-missing-var-metrics-list'); this.activeMetricsEndpoint = this.$monitoredMetricsPanel.data('active-metrics'); - } - init() { this.$panelToggle.on('click', e => this.handlePanelToggle(e)); } /* eslint-disable class-methods-use-this */ handlePanelToggle(e) { const $toggleBtn = $(e.currentTarget); - const $currentPanelBody = $toggleBtn.parents('.panel').find('.panel-body'); - if ($currentPanelBody.is(':visible')) { - $currentPanelBody.addClass('hidden'); + const $currentPanelBody = $toggleBtn.closest('.panel').find('.panel-body'); + $currentPanelBody.toggleClass('hidden'); + if ($toggleBtn.hasClass('fa-caret-down')) { $toggleBtn.removeClass('fa-caret-down').addClass('fa-caret-right'); } else { - $currentPanelBody.removeClass('hidden'); $toggleBtn.removeClass('fa-caret-right').addClass('fa-caret-down'); } } + showMonitoringMetricsPanelState(stateName) { + switch (stateName) { + case PANEL_STATE.LOADING: + this.$monitoredMetricsLoading.removeClass('hidden'); + this.$monitoredMetricsEmpty.addClass('hidden'); + this.$monitoredMetricsList.addClass('hidden'); + break; + case PANEL_STATE.LIST: + this.$monitoredMetricsLoading.addClass('hidden'); + this.$monitoredMetricsEmpty.addClass('hidden'); + this.$monitoredMetricsList.removeClass('hidden'); + break; + default: + this.$monitoredMetricsLoading.addClass('hidden'); + this.$monitoredMetricsEmpty.removeClass('hidden'); + this.$monitoredMetricsList.addClass('hidden'); + break; + } + } + populateActiveMetrics(metrics) { let totalMonitoredMetrics = 0; let totalMissingEnvVarMetrics = 0; metrics.forEach((metric) => { - this.$monitoredMetricsList.append(`
  • ${metric.group}${metric.active_metrics}
  • `); + this.$monitoredMetricsList.append(`
  • ${metric.group}${metric.active_metrics}
  • `); totalMonitoredMetrics += metric.active_metrics; if (metric.metrics_missing_requirements > 0) { this.$missingEnvVarMetricsList.append(`
  • ${metric.group}
  • `); @@ -49,17 +68,17 @@ export default class PrometheusMetrics { }); this.$monitoredMetricsCount.text(totalMonitoredMetrics); - this.$monitoredMetricsLoading.addClass('hidden'); - this.$monitoredMetricsList.removeClass('hidden'); + this.showMonitoringMetricsPanelState(PANEL_STATE.LIST); if (totalMissingEnvVarMetrics > 0) { this.$missingEnvVarPanel.removeClass('hidden'); + this.$missingEnvVarPanel.find('.flash-container').off('click'); this.$missingEnvVarMetricCount.text(totalMissingEnvVarMetrics); } } loadActiveMetrics() { - this.$monitoredMetricsLoading.removeClass('hidden'); + this.showMonitoringMetricsPanelState(PANEL_STATE.LOADING); gl.utils.backOff((next, stop) => { $.getJSON(this.activeMetricsEndpoint) .done((res) => { @@ -80,13 +99,11 @@ export default class PrometheusMetrics { if (res && res.data && res.data.length) { this.populateActiveMetrics(res.data); } else { - this.$monitoredMetricsLoading.addClass('hidden'); - this.$monitoredMetricsEmpty.removeClass('hidden'); + this.showMonitoringMetricsPanelState(PANEL_STATE.EMPTY); } }) .catch(() => { - this.$monitoredMetricsLoading.addClass('hidden'); - this.$monitoredMetricsEmpty.removeClass('hidden'); + this.showMonitoringMetricsPanelState(PANEL_STATE.EMPTY); }); } } diff --git a/app/assets/stylesheets/pages/settings.scss b/app/assets/stylesheets/pages/settings.scss index deed4501399..e2ed1239541 100644 --- a/app/assets/stylesheets/pages/settings.scss +++ b/app/assets/stylesheets/pages/settings.scss @@ -39,11 +39,11 @@ .prometheus-metrics-monitoring { .panel { .panel-toggle { - width: 12px; + width: 14px; + } - &.fa-caret-right { - padding-left: 4px; - } + .badge { + font-size: inherit; } .panel-heading .badge-count { @@ -55,14 +55,9 @@ padding: 0; } - .badge-count { - margin-left: 3px; - padding: 3px 8px; - border-radius: 40%; - } - .flash-container { margin-bottom: 0; + cursor: default; .flash-notice { border-radius: 0; @@ -80,25 +75,20 @@ margin-top: 10px; margin-bottom: 0; } - - p { - color: $gl-gray-light; - } } - .loading-metrics .fa-spin { + .loading-metrics .metrics-load-spinner { color: $loading-color; } .metrics-list { - list-style-type: none; - margin: 0; - padding: 0; + margin-bottom: 0; li { - padding: 16px; + padding: $gl-padding; - .badge-count { + .badge { + margin-left: 5px; background: $badge-bg; } } diff --git a/app/views/projects/services/prometheus/_show.html.haml b/app/views/projects/services/prometheus/_show.html.haml index 82d4dd2488f..f0bd8c8bee9 100644 --- a/app/views/projects/services/prometheus/_show.html.haml +++ b/app/views/projects/services/prometheus/_show.html.haml @@ -11,28 +11,28 @@ = link_to 'More information', '#' .col-lg-9 - .panel.panel-default.js-panel-monitored-metrics{ data: { "active-metrics" => "#{namespace_project_prometheus_active_metrics_path(@project.namespace, @project)}.json" } } + .panel.panel-default.js-panel-monitored-metrics{ data: { "active-metrics" => "#{namespace_project_prometheus_active_metrics_path(@project.namespace, @project, :json)}" } } .panel-heading %h3.panel-title Monitored - %span.badge-count.js-monitored-count 0 + %span.badge.js-monitored-count 0 .panel-body .loading-metrics.js-loading-metrics - = icon('spinner spin 3x') + = icon('spinner spin 3x', class: 'metrics-load-spinner') %p Finding and configuring metrics... .empty-metrics.hidden.js-empty-metrics = custom_icon('icon_empty_metrics') %p No metrics are being monitored. To start monitoring, deploy to an environment. = link_to project_environments_path(@project), title: 'View environments', class: 'btn btn-success' do View environments - %ul.metrics-list.hidden.js-metrics-list + %ul.list-unstyled.metrics-list.hidden.js-metrics-list .panel.panel-default.hidden.js-panel-missing-env-vars .panel-heading %h3.panel-title - = icon('caret-right lg', class: 'panel-toggle js-panel-toggle', 'aria-label' => 'Toggle panel') + = icon('caret-right lg fw', class: 'panel-toggle js-panel-toggle', 'aria-label' => 'Toggle panel') Missing environment variable - %span.badge-count.js-env-var-count 0 + %span.badge.js-env-var-count 0 .panel-body.hidden .flash-container .flash-notice @@ -42,4 +42,4 @@ $CI_ENVIRONMENT_SLUG to exporter’s queries. = link_to 'More information', '#' - %ul.metrics-list.js-missing-var-metrics-list + %ul.list-unstyled.metrics-list.js-missing-var-metrics-list diff --git a/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js b/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js index 8b4f386af80..e7187a8a5e0 100644 --- a/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js +++ b/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js @@ -1,4 +1,5 @@ import PrometheusMetrics from '~/prometheus_metrics/prometheus_metrics'; +import PANEL_STATE from '~/prometheus_metrics/constants'; import { metrics, missingVarMetrics } from './mock_data'; describe('PrometheusMetrics', () => { @@ -35,6 +36,38 @@ describe('PrometheusMetrics', () => { }); }); + describe('showMonitoringMetricsPanelState', () => { + let prometheusMetrics; + + beforeEach(() => { + prometheusMetrics = new PrometheusMetrics('.js-prometheus-metrics-monitoring'); + }); + + it('should show loading state when called with `loading`', () => { + prometheusMetrics.showMonitoringMetricsPanelState(PANEL_STATE.LOADING); + + expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBeFalsy(); + expect(prometheusMetrics.$monitoredMetricsEmpty.hasClass('hidden')).toBeTruthy(); + expect(prometheusMetrics.$monitoredMetricsList.hasClass('hidden')).toBeTruthy(); + }); + + it('should show metrics list when called with `list`', () => { + prometheusMetrics.showMonitoringMetricsPanelState(PANEL_STATE.LIST); + + expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBeTruthy(); + expect(prometheusMetrics.$monitoredMetricsEmpty.hasClass('hidden')).toBeTruthy(); + expect(prometheusMetrics.$monitoredMetricsList.hasClass('hidden')).toBeFalsy(); + }); + + it('should show empty state when called with `empty`', () => { + prometheusMetrics.showMonitoringMetricsPanelState(PANEL_STATE.EMPTY); + + expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBeTruthy(); + expect(prometheusMetrics.$monitoredMetricsEmpty.hasClass('hidden')).toBeFalsy(); + expect(prometheusMetrics.$monitoredMetricsList.hasClass('hidden')).toBeTruthy(); + }); + }); + describe('populateActiveMetrics', () => { let prometheusMetrics; @@ -52,7 +85,7 @@ describe('PrometheusMetrics', () => { expect(prometheusMetrics.$monitoredMetricsCount.text()).toEqual('12'); expect($metricsListLi.length).toEqual(metrics.length); - expect($metricsListLi.first().find('.badge-count').text()).toEqual(`${metrics[0].active_metrics}`); + expect($metricsListLi.first().find('.badge').text()).toEqual(`${metrics[0].active_metrics}`); }); it('should show missing environment variables list', () => { From 223abc6df005beba45a514b44af7227b224dadd3 Mon Sep 17 00:00:00 2001 From: kushalpandya Date: Fri, 2 Jun 2017 17:03:30 +0530 Subject: [PATCH 0035/1380] Use `.text-center` class instead of text-align prop --- app/assets/stylesheets/pages/settings.scss | 1 - app/views/projects/services/prometheus/_show.html.haml | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/pages/settings.scss b/app/assets/stylesheets/pages/settings.scss index e2ed1239541..7f39a99b59d 100644 --- a/app/assets/stylesheets/pages/settings.scss +++ b/app/assets/stylesheets/pages/settings.scss @@ -67,7 +67,6 @@ .loading-metrics, .empty-metrics { - text-align: center; padding: 30px 10px; p, diff --git a/app/views/projects/services/prometheus/_show.html.haml b/app/views/projects/services/prometheus/_show.html.haml index f0bd8c8bee9..c4ac384ca1a 100644 --- a/app/views/projects/services/prometheus/_show.html.haml +++ b/app/views/projects/services/prometheus/_show.html.haml @@ -17,10 +17,10 @@ Monitored %span.badge.js-monitored-count 0 .panel-body - .loading-metrics.js-loading-metrics + .loading-metrics.text-center.js-loading-metrics = icon('spinner spin 3x', class: 'metrics-load-spinner') %p Finding and configuring metrics... - .empty-metrics.hidden.js-empty-metrics + .empty-metrics.text-center.hidden.js-empty-metrics = custom_icon('icon_empty_metrics') %p No metrics are being monitored. To start monitoring, deploy to an environment. = link_to project_environments_path(@project), title: 'View environments', class: 'btn btn-success' do From e74896df0c7d0d88958a3d35b3144361cfdd0594 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Wed, 31 May 2017 19:36:07 +0200 Subject: [PATCH 0036/1380] Matched Metrics tests --- config/additional_metrics.yml | 14 ++++-- lib/gitlab/prometheus/metric.rb | 21 +++----- lib/gitlab/prometheus/metric_group.rb | 2 +- .../queries/matched_metrics_query.rb | 49 ++++++++++-------- .../queries/matched_metrics_query_spec.rb | 50 +++++++++++++++++++ 5 files changed, 97 insertions(+), 39 deletions(-) create mode 100644 spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb diff --git a/config/additional_metrics.yml b/config/additional_metrics.yml index 59ca387f055..d84db1530a8 100644 --- a/config/additional_metrics.yml +++ b/config/additional_metrics.yml @@ -3,25 +3,31 @@ metrics: - title: "Memory usage" y_label: "Values" - detect: container_memory_usage_bytes + required_metrics: + - container_memory_usage_bytes weight: 1 queries: - query_range: 'avg(container_memory_usage_bytes{%{environment_filter}}) / 2^20' label: Container memory + display_empty: true unit: MiB - title: "Current memory usage" - detect: container_memory_usage_bytes + required_metrics: + - container_memory_usage_bytes weight: 1 queries: - query: 'avg(container_memory_usage_bytes{%{environment_filter}}) / 2^20' + display_empty: false unit: MiB - title: "CPU usage" - detect: container_cpu_usage_seconds_total + required_metrics: + - container_cpu_usage_seconds_total weight: 1 queries: - query_range: 'avg(rate(container_cpu_usage_seconds_total{%{environment_filter}}[2m])) * 100' - title: "Current CPU usage" - detect: container_cpu_usage_seconds_total + required_metrics: + - container_cpu_usage_seconds_total weight: 1 queries: - query: 'avg(rate(container_cpu_usage_seconds_total{%{environment_filter}}[2m])) * 100' diff --git a/lib/gitlab/prometheus/metric.rb b/lib/gitlab/prometheus/metric.rb index 777cf030ceb..d7cd4237a7b 100644 --- a/lib/gitlab/prometheus/metric.rb +++ b/lib/gitlab/prometheus/metric.rb @@ -1,29 +1,24 @@ module Gitlab::Prometheus class Metric - attr_reader :group, :title, :detect, :weight, :y_label, :queries + attr_reader :group, :title, :required_metrics, :weight, :y_label, :queries - def initialize(group, title, detect, weight, y_label, queries = []) - @group = group + def initialize(title, required_metrics, weight, y_label, queries = []) @title = title - @detect = detect + @required_metrics = required_metrics @weight = weight @y_label = y_label || 'Values' @queries = queries end - def self.metric_from_entry(group, entry) - missing_fields = [:title, :detect, :weight, :queries].select { |key| !entry.has_key?(key) } + def self.metric_from_entry(entry) + missing_fields = [:title, :required_metrics, :weight, :queries].select { |key| !entry.has_key?(key) } raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? - Metric.new(group, entry[:title], entry[:detect], entry[:weight], entry[:y_label],entry[:queries]) + Metric.new(entry[:title], entry[:required_metrics], entry[:weight], entry[:y_label], entry[:queries]) end - def self.metrics_from_list(group, list) - list.map { |entry| metric_from_entry(group, entry) } - end - - def self.additional_metrics_raw - @additional_metrics_raw ||= YAML.load_file(Rails.root.join('config/additional_metrics.yml')).map(&:deep_symbolize_keys) + def self.metrics_from_list(list) + list.map { |entry| metric_from_entry(entry) } end end end diff --git a/lib/gitlab/prometheus/metric_group.rb b/lib/gitlab/prometheus/metric_group.rb index 9f95525bc0c..0dcd9dc0f36 100644 --- a/lib/gitlab/prometheus/metric_group.rb +++ b/lib/gitlab/prometheus/metric_group.rb @@ -22,7 +22,7 @@ module Gitlab::Prometheus raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? group = MetricGroup.new(entry[:group], entry[:priority]) - group.metrics = Metric.metrics_from_list(group, entry[:metrics]) + group.metrics = Metric.metrics_from_list(entry[:metrics]) group end diff --git a/lib/gitlab/prometheus/queries/matched_metrics_query.rb b/lib/gitlab/prometheus/queries/matched_metrics_query.rb index 5a8b0f6c701..a5e1f6a3fde 100644 --- a/lib/gitlab/prometheus/queries/matched_metrics_query.rb +++ b/lib/gitlab/prometheus/queries/matched_metrics_query.rb @@ -16,31 +16,28 @@ module Gitlab::Prometheus::Queries private def groups_data - metrics_series = metrics_with_series(Gitlab::Prometheus::MetricGroup.all) - lookup = active_series_lookup(metrics_series) + metrics_groups = groups_with_active_metrics(Gitlab::Prometheus::MetricGroup.all) + lookup = active_series_lookup(metrics_groups) groups = {} - metrics_series.each do |metrics, series| - groups[metrics.group] ||= { active_metrics: 0, metrics_missing_requirements: 0 } - group = groups[metrics.group] + metrics_groups.each do |group| + groups[group] ||= { active_metrics: 0, metrics_missing_requirements: 0 } + metrics = group.metrics.flat_map(&:required_metrics) + active_metrics = metrics.count(&lookup.method(:has_key?)) - if series.all?(&lookup.method(:has_key?)) - group[:active_metrics] += 1 - else - group[:metrics_missing_requirements] += 1 - end - group + groups[group][:active_metrics] += active_metrics + groups[group][:metrics_missing_requirements] += metrics.count - active_metrics end groups end - def active_series_lookup(metrics) + def active_series_lookup(metric_groups) timeframe_start = 8.hours.ago timeframe_end = Time.now - series = metrics.flat_map { |metrics, series| series }.uniq + series = metric_groups.flat_map(&:metrics).flat_map(&:required_metrics).uniq lookup = series.each_slice(MAX_QUERY_ITEMS).flat_map do |batched_series| client_series(*batched_series, start: timeframe_start, stop: timeframe_end) @@ -54,17 +51,27 @@ module Gitlab::Prometheus::Queries series_info.has_key?('environment') end - def metrics_with_series(metric_groups) - label_values = client_label_values || [] + def available_metrics + @available_metrics ||= client_label_values || [] + end - metrics = metric_groups.flat_map do |group| - group.metrics.map do |metric| - matcher = Regexp.compile(metric.detect) - [metric, label_values.select(&matcher.method(:match))] + def filter_active_metrics(metric_group) + metric_group.metrics.select! do |metric| + metric.required_metrics.all?(&available_metrics.method(:include?)) + end + metric_group + end + + def groups_with_active_metrics(metric_groups) + metric_groups.map(&method(:filter_active_metrics)).select { |group| group.metrics.any? } + end + + def metrics_with_required_series(metric_groups) + metric_groups.flat_map do |group| + group.metrics.select do |metric| + metric.required_metrics.all?(&available_metrics.method(:include?)) end end - - metrics.select { |metric, labels| labels&.any? } end end end diff --git a/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb b/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb new file mode 100644 index 00000000000..0aee9d37889 --- /dev/null +++ b/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb @@ -0,0 +1,50 @@ +require 'spec_helper' + +describe Gitlab::Prometheus::Queries::MatchedMetricsQuery, lib: true do + let(:environment) { create(:environment, slug: 'environment-slug') } + let(:deployment) { create(:deployment, environment: environment) } + + let(:client) { double('prometheus_client') } + subject { described_class.new(client) } + + around do |example| + time_without_subsecond_values = Time.local(2008, 9, 1, 12, 0, 0) + Timecop.freeze(time_without_subsecond_values) { example.run } + end + + let(:metric_group_class) { Gitlab::Prometheus::MetricGroup } + let(:metric_class) { Gitlab::Prometheus::Metric } + + let(:simple_metrics) do + [ + metric_class.new('title', ['metrica', 'metricb'], '1', 'y_label', [{ :query_range => 'avg' }]) + ] + end + + let(:simple_metric_group) do + metric_group_class.new('name', 1, simple_metrics) + end + + let(:xx) do + [{ + '__name__': 'metrica', + 'environment': 'mattermost' + }, + { + '__name__': 'metricb', + 'environment': 'mattermost' + }] + end + + before do + allow(metric_group_class).to receive(:all).and_return([simple_metric_group]) + + allow(client).to receive(:label_values).and_return(['metrica', 'metricb']) + allow(client).to receive(:series).and_return(xx) + end + + it "something something" do + + expect(subject.query).to eq("asf") + end +end From 6a70509a2763717e592c603249855bfb43519d2f Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Fri, 2 Jun 2017 23:32:59 +0200 Subject: [PATCH 0037/1380] Towards Reviewable prometheus --- .../queries/matched_metrics_query.rb | 7 +- spec/db/production/settings.rb.orig | 16 +++ .../queries/matched_metrics_query_spec.rb | 129 +++++++++++++----- .../matched_metrics_query_helper.rb | 33 +++++ 4 files changed, 148 insertions(+), 37 deletions(-) create mode 100644 spec/db/production/settings.rb.orig create mode 100644 spec/support/prometheus/matched_metrics_query_helper.rb diff --git a/lib/gitlab/prometheus/queries/matched_metrics_query.rb b/lib/gitlab/prometheus/queries/matched_metrics_query.rb index a5e1f6a3fde..fc97bca486c 100644 --- a/lib/gitlab/prometheus/queries/matched_metrics_query.rb +++ b/lib/gitlab/prometheus/queries/matched_metrics_query.rb @@ -23,11 +23,10 @@ module Gitlab::Prometheus::Queries metrics_groups.each do |group| groups[group] ||= { active_metrics: 0, metrics_missing_requirements: 0 } - metrics = group.metrics.flat_map(&:required_metrics) - active_metrics = metrics.count(&lookup.method(:has_key?)) + active_metrics = group.metrics.count { |metric| metric.required_metrics.all?(&lookup.method(:has_key?)) } groups[group][:active_metrics] += active_metrics - groups[group][:metrics_missing_requirements] += metrics.count - active_metrics + groups[group][:metrics_missing_requirements] += group.metrics.count - active_metrics end groups @@ -48,7 +47,7 @@ module Gitlab::Prometheus::Queries end def has_matching_label(series_info) - series_info.has_key?('environment') + series_info.key?('environment') end def available_metrics diff --git a/spec/db/production/settings.rb.orig b/spec/db/production/settings.rb.orig new file mode 100644 index 00000000000..3cbb173c4cc --- /dev/null +++ b/spec/db/production/settings.rb.orig @@ -0,0 +1,16 @@ +require 'spec_helper' + +describe 'seed production settings', lib: true do + include StubENV + + context 'GITLAB_SHARED_RUNNERS_REGISTRATION_TOKEN is set in the environment' do + before do + stub_env('GITLAB_SHARED_RUNNERS_REGISTRATION_TOKEN', '013456789') + end + + it 'writes the token to the database' do + load(File.join(__dir__, '../../../db/fixtures/production/010_settings.rb')) + expect(ApplicationSetting.current.runners_registration_token).to eq('013456789') + end + end +end diff --git a/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb b/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb index 0aee9d37889..d46de56f520 100644 --- a/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb @@ -1,50 +1,113 @@ require 'spec_helper' describe Gitlab::Prometheus::Queries::MatchedMetricsQuery, lib: true do - let(:environment) { create(:environment, slug: 'environment-slug') } - let(:deployment) { create(:deployment, environment: environment) } - - let(:client) { double('prometheus_client') } - subject { described_class.new(client) } - - around do |example| - time_without_subsecond_values = Time.local(2008, 9, 1, 12, 0, 0) - Timecop.freeze(time_without_subsecond_values) { example.run } - end + include Prometheus::MatchedMetricsQueryHelper let(:metric_group_class) { Gitlab::Prometheus::MetricGroup } let(:metric_class) { Gitlab::Prometheus::Metric } - let(:simple_metrics) do - [ - metric_class.new('title', ['metrica', 'metricb'], '1', 'y_label', [{ :query_range => 'avg' }]) - ] + let(:client) { double('prometheus_client') } + + subject { described_class.new(client) } + + context 'with one group where two metrics are found' do + before do + allow(metric_group_class).to receive(:all).and_return([simple_metric_group]) + allow(client).to receive(:label_values).and_return(metric_names) + end + + context 'both metrics in the group pass requirements' do + before do + allow(client).to receive(:series).and_return(series_info_with_environment) + end + + it 'responds with both metrics as actve' do + expect(subject.query).to eq([{ group: 'name', priority: 1, active_metrics: 2, metrics_missing_requirements: 0 }]) + end + end + + context 'none of the metrics pass requirements' do + before do + allow(client).to receive(:series).and_return(series_info_without_environment) + end + + it 'responds with both metrics missing requirements' do + expect(subject.query).to eq([{ group: 'name', priority: 1, active_metrics: 0, metrics_missing_requirements: 2 }]) + end + end + + context 'no series information found about the metrics' do + before do + allow(client).to receive(:series).and_return(empty_series_info) + end + + it 'responds with both metrics missing requirements' do + expect(subject.query).to eq([{ group: 'name', priority: 1, active_metrics: 0, metrics_missing_requirements: 2 }]) + end + end + + context 'one of the series info was not found' do + before do + allow(client).to receive(:series).and_return(partialy_empty_series_info) + end + it 'responds with one active and one missing metric' do + expect(subject.query).to eq([{ group: 'name', priority: 1, active_metrics: 1, metrics_missing_requirements: 1 }]) + end + end end - let(:simple_metric_group) do - metric_group_class.new('name', 1, simple_metrics) + context 'with one group where only one metric is found' do + before do + allow(metric_group_class).to receive(:all).and_return([simple_metric_group]) + allow(client).to receive(:label_values).and_return('metric_a') + end + + context 'both metrics in the group pass requirements' do + before do + allow(client).to receive(:series).and_return(series_info_with_environment) + end + + it 'responds with one metrics as active and no missing requiremens' do + expect(subject.query).to eq([{ group: 'name', priority: 1, active_metrics: 1, metrics_missing_requirements: 0 }]) + end + end + + context 'no metrics in group pass requirements' do + before do + allow(client).to receive(:series).and_return(series_info_without_environment) + end + + it 'responds with one metrics as active and no missing requiremens' do + expect(subject.query).to eq([{ group: 'name', priority: 1, active_metrics: 0, metrics_missing_requirements: 1 }]) + end + end end - let(:xx) do - [{ - '__name__': 'metrica', - 'environment': 'mattermost' - }, - { - '__name__': 'metricb', - 'environment': 'mattermost' - }] - end + context 'with two groups where only one metric is found' do + before do + allow(metric_group_class).to receive(:all).and_return([simple_metric_group, + simple_metric_group('nameb', simple_metrics('metric_c'))]) + allow(client).to receive(:label_values).and_return('metric_c') + end - before do - allow(metric_group_class).to receive(:all).and_return([simple_metric_group]) + context 'both metrics in the group pass requirements' do + before do + allow(client).to receive(:series).and_return(series_info_with_environment('metric_c')) + end - allow(client).to receive(:label_values).and_return(['metrica', 'metricb']) - allow(client).to receive(:series).and_return(xx) - end + it 'responds with one metrics as active and no missing requiremens' do + expect(subject.query).to eq([{ group: 'nameb', priority: 1, active_metrics: 1, metrics_missing_requirements: 0 }]) + end + end - it "something something" do + context 'no metris in group pass requirements' do + before do + allow(client).to receive(:series).and_return(series_info_without_environment) + end - expect(subject.query).to eq("asf") + it 'responds with one metrics as active and no missing requiremens' do + expect(subject.query).to eq([{ group: 'nameb', priority: 1, active_metrics: 0, metrics_missing_requirements: 1 }]) + end + end end end diff --git a/spec/support/prometheus/matched_metrics_query_helper.rb b/spec/support/prometheus/matched_metrics_query_helper.rb new file mode 100644 index 00000000000..ecaf85e3338 --- /dev/null +++ b/spec/support/prometheus/matched_metrics_query_helper.rb @@ -0,0 +1,33 @@ +module Prometheus + module MatchedMetricsQueryHelper + def metric_names + %w{metric_a metric_b} + end + + def simple_metrics(metric_name = 'metric_a') + [metric_class.new('title', %W(#{metric_name} metric_b), nil, nil), + metric_class.new('title', [metric_name], nil, nil)] + end + + def simple_metric_group(name = 'name', metrics = simple_metrics) + metric_group_class.new(name, 1, metrics) + end + + def series_info_with_environment(*more_metrics) + %w{metric_a metric_b}.concat(more_metrics).map { |metric_name| { '__name__' => metric_name, 'environment' => '' } } + end + + def series_info_without_environment + [{ '__name__' => 'metric_a' }, + { '__name__' => 'metric_b' }] + end + + def partialy_empty_series_info + [{ '__name__' => 'metric_a', 'environment' => '' }] + end + + def empty_series_info + [] + end + end +end From ae5268ce8cc533be4086a11d9d89fa726136d59d Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Mon, 5 Jun 2017 11:32:56 +0200 Subject: [PATCH 0038/1380] Additional Metrics tests --- config/additional_metrics.yml | 1 - .../queries/additional_metrics_query.rb | 35 ++++++++----- .../queries/additional_metrics_query_spec.rb | 49 ++++++++++++++++++ .../queries/matched_metrics_query_spec.rb | 2 +- .../additional_metrics_query_helper.rb | 51 +++++++++++++++++++ .../matched_metrics_query_helper.rb | 6 +-- 6 files changed, 126 insertions(+), 18 deletions(-) create mode 100644 spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb create mode 100644 spec/support/prometheus/additional_metrics_query_helper.rb diff --git a/config/additional_metrics.yml b/config/additional_metrics.yml index d84db1530a8..daecde49570 100644 --- a/config/additional_metrics.yml +++ b/config/additional_metrics.yml @@ -9,7 +9,6 @@ queries: - query_range: 'avg(container_memory_usage_bytes{%{environment_filter}}) / 2^20' label: Container memory - display_empty: true unit: MiB - title: "Current memory usage" required_metrics: diff --git a/lib/gitlab/prometheus/queries/additional_metrics_query.rb b/lib/gitlab/prometheus/queries/additional_metrics_query.rb index fd7f072834d..d21a3978e25 100644 --- a/lib/gitlab/prometheus/queries/additional_metrics_query.rb +++ b/lib/gitlab/prometheus/queries/additional_metrics_query.rb @@ -17,26 +17,42 @@ module Gitlab::Prometheus::Queries def query_metrics(query_context) query_processor = method(:process_query).curry[query_context] - matched_metrics.map do |group| + groups = matched_metrics.map do |group| metrics = group.metrics.map do |metric| { title: metric.title, weight: metric.weight, y_label: metric.y_label, - queries: metric.queries.map(&query_processor) + queries: metric.queries.map(&query_processor).select(&method(:query_with_result)) } end { group: group.name, priority: group.priority, - metrics: metrics + metrics: metrics.select(&method(:metric_with_any_queries)) } end + + groups.select(&method(:group_with_any_metrics)) end private + def metric_with_any_queries(metric) + metric[:queries]&.count > 0 + end + + def group_with_any_metrics(group) + group[:metrics]&.count > 0 + end + + def query_with_result(query) + query[:result]&.any? do |item| + item&.[](:values)&.any? || item&.[](:value)&.any? + end + end + def process_query(context, query) query_with_result = query.dup query_with_result[:result] = @@ -48,22 +64,15 @@ module Gitlab::Prometheus::Queries query_with_result end - def process_result(query_result) - contains_metrics = query_result.all? do |item| - item&.[](:values)&.any? || item&.[](:value)&.any? - end - contains_metrics + def available_metrics + @available_metrics ||= client_label_values || [] end def matched_metrics - label_values = client_label_values || [] - Gitlab::Prometheus::MetricGroup.all - result = Gitlab::Prometheus::MetricGroup.all.map do |group| group.metrics.select! do |metric| - matcher = Regexp.compile(metric.detect) - label_values.any? &matcher.method(:match) + metric.required_metrics.all?(&available_metrics.method(:include?)) end group end diff --git a/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb b/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb new file mode 100644 index 00000000000..c7e2dbc12ec --- /dev/null +++ b/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb @@ -0,0 +1,49 @@ +require 'spec_helper' + +describe Gitlab::Prometheus::Queries::AdditionalMetricsQuery, lib: true do + include Prometheus::AdditionalMetricsQueryHelper + + let(:metric_group_class) { Gitlab::Prometheus::MetricGroup } + let(:metric_class) { Gitlab::Prometheus::Metric } + + let(:client) { double('prometheus_client') } + let(:environment) { create(:environment, slug: 'environment-slug') } + + subject(:query_result) { described_class.new(client).query(environment.id) } + + + context 'with one group where two metrics is found' do + before do + allow(metric_group_class).to receive(:all).and_return([simple_metric_group]) + allow(client).to receive(:label_values).and_return(metric_names) + end + + context 'some querie return results' do + before do + expect(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result) + expect(client).to receive(:query_range).with('query_range_b', any_args).and_return(query_range_result) + expect(client).to receive(:query_range).with('query_range_empty', any_args).and_return([]) + end + + it 'return results only for queries with results' do + puts query_result + expected = { + group: 'name', + priority: 1, + metrics: + [ + { + title: 'title', weight: nil, y_label: 'Values', queries: + [ + { query_range: 'query_range_a', result: query_range_result }, + { query_range: 'query_range_b', label: 'label', unit: 'unit', result: query_range_result } + ] + } + ] + } + + expect(query_result).to eq([expected]) + end + end + end +end diff --git a/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb b/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb index d46de56f520..390fff568cc 100644 --- a/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb @@ -10,7 +10,7 @@ describe Gitlab::Prometheus::Queries::MatchedMetricsQuery, lib: true do subject { described_class.new(client) } - context 'with one group where two metrics are found' do + context 'with one group where two metrics is found' do before do allow(metric_group_class).to receive(:all).and_return([simple_metric_group]) allow(client).to receive(:label_values).and_return(metric_names) diff --git a/spec/support/prometheus/additional_metrics_query_helper.rb b/spec/support/prometheus/additional_metrics_query_helper.rb new file mode 100644 index 00000000000..d80beb066ff --- /dev/null +++ b/spec/support/prometheus/additional_metrics_query_helper.rb @@ -0,0 +1,51 @@ +module Prometheus + module AdditionalMetricsQueryHelper + def metric_names + %w{metric_a metric_b} + end + + def simple_queries + [{ query_range: 'query_range_a' }, { query_range: 'query_range_b', label: 'label', unit: 'unit' }] + end + + def simple_query(suffix = 'a') + [{ query_range: "query_range_#{suffix}" }] + end + + def simple_metrics + [ + Gitlab::Prometheus::Metric.new('title', %w(metric_a metric_b), nil, nil, simple_queries), + Gitlab::Prometheus::Metric.new('title', %w{metric_a}, nil, nil, simple_query('empty')), + Gitlab::Prometheus::Metric.new('title', %w{metric_c}, nil, nil) + ] + end + + def simple_metric_group(name = 'name', metrics = simple_metrics) + Gitlab::Prometheus::MetricGroup.new(name, 1, metrics) + end + + def query_result + [ + { + 'metric': {}, + 'value': [ + 1488772511.004, + '0.000041021495238095323' + ] + } + ] + end + + def query_range_result + [ + { + 'metric': {}, + 'values': [ + [1488758662.506, '0.00002996364761904785'], + [1488758722.506, '0.00003090239047619091'] + ] + } + ] + end + end +end diff --git a/spec/support/prometheus/matched_metrics_query_helper.rb b/spec/support/prometheus/matched_metrics_query_helper.rb index ecaf85e3338..86e874fb295 100644 --- a/spec/support/prometheus/matched_metrics_query_helper.rb +++ b/spec/support/prometheus/matched_metrics_query_helper.rb @@ -5,12 +5,12 @@ module Prometheus end def simple_metrics(metric_name = 'metric_a') - [metric_class.new('title', %W(#{metric_name} metric_b), nil, nil), - metric_class.new('title', [metric_name], nil, nil)] + [Gitlab::Prometheus::Metric.new('title', %W(#{metric_name} metric_b), nil, nil), + Gitlab::Prometheus::Metric.new('title', [metric_name], nil, nil)] end def simple_metric_group(name = 'name', metrics = simple_metrics) - metric_group_class.new(name, 1, metrics) + Gitlab::Prometheus::MetricGroup.new(name, 1, metrics) end def series_info_with_environment(*more_metrics) From eaaad702deab2ff73cc204d55056745bf34c703e Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Mon, 5 Jun 2017 13:33:11 +0200 Subject: [PATCH 0039/1380] Additional metrics test using multiple groups --- .../queries/additional_metrics_query_spec.rb | 98 ++++++++++++++++--- .../additional_metrics_query_helper.rb | 20 ---- spec/support/prometheus/metric_builders.rb | 27 +++++ 3 files changed, 112 insertions(+), 33 deletions(-) create mode 100644 spec/support/prometheus/metric_builders.rb diff --git a/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb b/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb index c7e2dbc12ec..617028cde37 100644 --- a/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb @@ -2,6 +2,7 @@ require 'spec_helper' describe Gitlab::Prometheus::Queries::AdditionalMetricsQuery, lib: true do include Prometheus::AdditionalMetricsQueryHelper + include Prometheus::MetricBuilders let(:metric_group_class) { Gitlab::Prometheus::MetricGroup } let(:metric_class) { Gitlab::Prometheus::Metric } @@ -11,6 +12,9 @@ describe Gitlab::Prometheus::Queries::AdditionalMetricsQuery, lib: true do subject(:query_result) { described_class.new(client).query(environment.id) } + around do |example| + Timecop.freeze { example.run } + end context 'with one group where two metrics is found' do before do @@ -18,7 +22,7 @@ describe Gitlab::Prometheus::Queries::AdditionalMetricsQuery, lib: true do allow(client).to receive(:label_values).and_return(metric_names) end - context 'some querie return results' do + context 'some queries return results' do before do expect(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result) expect(client).to receive(:query_range).with('query_range_b', any_args).and_return(query_range_result) @@ -26,23 +30,91 @@ describe Gitlab::Prometheus::Queries::AdditionalMetricsQuery, lib: true do end it 'return results only for queries with results' do - puts query_result - expected = { - group: 'name', - priority: 1, - metrics: - [ + expected = [ + { + group: 'name', + priority: 1, + metrics: [ { - title: 'title', weight: nil, y_label: 'Values', queries: - [ - { query_range: 'query_range_a', result: query_range_result }, - { query_range: 'query_range_b', label: 'label', unit: 'unit', result: query_range_result } + title: 'title', weight: nil, y_label: 'Values', queries: [ + { query_range: 'query_range_a', result: query_range_result }, + { query_range: 'query_range_b', label: 'label', unit: 'unit', result: query_range_result } + ] + } + ] + } + ] + + expect(query_result).to eq(expected) + end + end + end + + context 'with two groups with one metric each' do + let(:metrics) { [simple_metric(queries: [simple_query])] } + before do + allow(metric_group_class).to receive(:all).and_return( + [ + simple_metric_group('group_a', [simple_metric(queries: [simple_query])]), + simple_metric_group('group_b', [simple_metric(title: 'title_b', queries: [simple_query('b')])]) + ]) + allow(client).to receive(:label_values).and_return(metric_names) + end + + context 'some queries return results' do + before do + expect(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result) + expect(client).to receive(:query_range).with('query_range_b', any_args).and_return(query_range_result) + end + + it 'return results only for queries with results' do + puts query_result + expected = [ + { + group: 'group_a', + priority: 1, + metrics: [ + { + title: 'title', + weight: nil, + y_label: 'Values', + queries: [ + { + query_range: 'query_range_a', + result: [ + { + metric: {}, + values: [[1488758662.506, '0.00002996364761904785'], [1488758722.506, '0.00003090239047619091']] } + ] + } ] } ] - } + }, + { + group: 'group_b', + priority: 1, + metrics: [ + { + title: 'title_b', + weight: nil, + y_label: 'Values', + queries: [ + { + query_range: 'query_range_b', result: [ + { + metric: {}, + values: [[1488758662.506, '0.00002996364761904785'], [1488758722.506, '0.00003090239047619091']] + } + ] + } + ] + } + ] + } + ] - expect(query_result).to eq([expected]) + expect(query_result).to eq(expected) end end end diff --git a/spec/support/prometheus/additional_metrics_query_helper.rb b/spec/support/prometheus/additional_metrics_query_helper.rb index d80beb066ff..84cbc24a301 100644 --- a/spec/support/prometheus/additional_metrics_query_helper.rb +++ b/spec/support/prometheus/additional_metrics_query_helper.rb @@ -4,26 +4,6 @@ module Prometheus %w{metric_a metric_b} end - def simple_queries - [{ query_range: 'query_range_a' }, { query_range: 'query_range_b', label: 'label', unit: 'unit' }] - end - - def simple_query(suffix = 'a') - [{ query_range: "query_range_#{suffix}" }] - end - - def simple_metrics - [ - Gitlab::Prometheus::Metric.new('title', %w(metric_a metric_b), nil, nil, simple_queries), - Gitlab::Prometheus::Metric.new('title', %w{metric_a}, nil, nil, simple_query('empty')), - Gitlab::Prometheus::Metric.new('title', %w{metric_c}, nil, nil) - ] - end - - def simple_metric_group(name = 'name', metrics = simple_metrics) - Gitlab::Prometheus::MetricGroup.new(name, 1, metrics) - end - def query_result [ { diff --git a/spec/support/prometheus/metric_builders.rb b/spec/support/prometheus/metric_builders.rb new file mode 100644 index 00000000000..2d54ecdfb5c --- /dev/null +++ b/spec/support/prometheus/metric_builders.rb @@ -0,0 +1,27 @@ +module Prometheus + module MetricBuilders + def simple_query(suffix = 'a', **opts) + { query_range: "query_range_#{suffix}" }.merge(opts) + end + + def simple_queries + [simple_query, simple_query('b', label: 'label', unit: 'unit')] + end + + def simple_metric(title: 'title', required_metrics: [], queries: []) + Gitlab::Prometheus::Metric.new(title, required_metrics, nil, nil, queries) + end + + def simple_metrics + [ + simple_metric(required_metrics: %w(metric_a metric_b), queries: simple_queries), + simple_metric(required_metrics: %w{metric_a}, queries: [simple_query('empty')]), + simple_metric(required_metrics: %w{metric_c}) + ] + end + + def simple_metric_group(name = 'name', metrics = simple_metrics) + Gitlab::Prometheus::MetricGroup.new(name, 1, metrics) + end + end +end \ No newline at end of file From cf4aeafa6f3baaec7652f486cd04b7170dde9fbf Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Mon, 5 Jun 2017 14:42:53 +0200 Subject: [PATCH 0040/1380] Test Partial additional query response --- .../queries/additional_metrics_query_spec.rb | 54 +++++++++++++++---- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb b/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb index 617028cde37..2291c4d67bb 100644 --- a/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb @@ -24,12 +24,12 @@ describe Gitlab::Prometheus::Queries::AdditionalMetricsQuery, lib: true do context 'some queries return results' do before do - expect(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result) - expect(client).to receive(:query_range).with('query_range_b', any_args).and_return(query_range_result) - expect(client).to receive(:query_range).with('query_range_empty', any_args).and_return([]) + allow(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result) + allow(client).to receive(:query_range).with('query_range_b', any_args).and_return(query_range_result) + allow(client).to receive(:query_range).with('query_range_empty', any_args).and_return([]) end - it 'return results only for queries with results' do + it 'return group data only for queries with results' do expected = [ { group: 'name', @@ -61,14 +61,13 @@ describe Gitlab::Prometheus::Queries::AdditionalMetricsQuery, lib: true do allow(client).to receive(:label_values).and_return(metric_names) end - context 'some queries return results' do + context 'both queries return results' do before do - expect(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result) - expect(client).to receive(:query_range).with('query_range_b', any_args).and_return(query_range_result) + allow(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result) + allow(client).to receive(:query_range).with('query_range_b', any_args).and_return(query_range_result) end - it 'return results only for queries with results' do - puts query_result + it 'return group data both queries' do expected = [ { group: 'group_a', @@ -117,5 +116,42 @@ describe Gitlab::Prometheus::Queries::AdditionalMetricsQuery, lib: true do expect(query_result).to eq(expected) end end + + context 'one query returns result' do + before do + allow(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result) + allow(client).to receive(:query_range).with('query_range_b', any_args).and_return([]) + end + + it 'queries using specific time' do + expect(client).to receive(:query_range).with(anything, start: 8.hours.ago.to_f, stop: Time.now.to_f) + + expect(query_result).not_to be_nil + end + + it 'return group data only for query with results' do + expected = [ + { + group: 'group_a', + priority: 1, + metrics: [ + { + title: 'title', + weight: nil, + y_label: 'Values', + queries: [ + { + query_range: 'query_range_a', + result: query_range_result + } + ] + } + ] + } + ] + + expect(query_result).to eq(expected) + end + end end end From 223d07b38315a68fe39df90a7675f043d8b7acaf Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Mon, 5 Jun 2017 18:38:09 +0200 Subject: [PATCH 0041/1380] Environments#additional_metrics tests --- .../projects/environments_controller_spec.rb | 40 ++++++++ spec/models/environment_spec.rb | 93 +++++++++++++++++++ 2 files changed, 133 insertions(+) diff --git a/spec/controllers/projects/environments_controller_spec.rb b/spec/controllers/projects/environments_controller_spec.rb index 20f99b209eb..12efdc700c5 100644 --- a/spec/controllers/projects/environments_controller_spec.rb +++ b/spec/controllers/projects/environments_controller_spec.rb @@ -311,6 +311,46 @@ describe Projects::EnvironmentsController do end end + describe 'GET #additional_metrics' do + before do + allow(controller).to receive(:environment).and_return(environment) + end + + context 'when environment has no metrics' do + before do + expect(environment).to receive(:additional_metrics).and_return(nil) + end + + context 'when requesting metrics as JSON' do + it 'returns a metrics JSON document' do + get :additional_metrics, environment_params(format: :json) + + expect(response).to have_http_status(204) + expect(json_response).to eq({}) + end + end + end + + context 'when environment has some metrics' do + before do + expect(environment).to receive(:additional_metrics).and_return({ + success: true, + data: {}, + last_update: 42 + }) + end + + it 'returns a metrics JSON document' do + get :additional_metrics, environment_params(format: :json) + + expect(response).to be_ok + expect(json_response['success']).to be(true) + expect(json_response['data']).to eq({}) + expect(json_response['last_update']).to eq(42) + end + end + end + def environment_params(opts = {}) opts.reverse_merge(namespace_id: project.namespace, project_id: project, diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index 12519de8636..12de9c9111b 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -409,6 +409,99 @@ describe Environment, models: true do end end + describe '#has_metrics?' do + subject { environment.has_metrics? } + + context 'when the enviroment is available' do + context 'with a deployment service' do + let(:project) { create(:prometheus_project) } + + context 'and a deployment' do + let!(:deployment) { create(:deployment, environment: environment) } + it { is_expected.to be_truthy } + end + + context 'but no deployments' do + it { is_expected.to be_falsy } + end + end + + context 'without a monitoring service' do + it { is_expected.to be_falsy } + end + end + + context 'when the environment is unavailable' do + let(:project) { create(:prometheus_project) } + + before do + environment.stop + end + + it { is_expected.to be_falsy } + end + end + + describe '#additional_metrics' do + let(:project) { create(:prometheus_project) } + subject { environment.additional_metrics } + + context 'when the environment has additional metrics' do + before do + allow(environment).to receive(:has_additional_metrics?).and_return(true) + end + + it 'returns the additional metrics from the deployment service' do + expect(project.monitoring_service).to receive(:reactive_query) + .with(Gitlab::Prometheus::Queries::AdditionalMetricsQuery.name, environment.id) + .and_return(:fake_metrics) + + is_expected.to eq(:fake_metrics) + end + end + + context 'when the environment does not have metrics' do + before do + allow(environment).to receive(:has_additional_metrics?).and_return(false) + end + + it { is_expected.to be_nil } + end + end + + describe '#has_additional_metrics??' do + subject { environment.has_metrics? } + + context 'when the enviroment is available' do + context 'with a deployment service' do + let(:project) { create(:prometheus_project) } + + context 'and a deployment' do + let!(:deployment) { create(:deployment, environment: environment) } + it { is_expected.to be_truthy } + end + + context 'but no deployments' do + it { is_expected.to be_falsy } + end + end + + context 'without a monitoring service' do + it { is_expected.to be_falsy } + end + end + + context 'when the environment is unavailable' do + let(:project) { create(:prometheus_project) } + + before do + environment.stop + end + + it { is_expected.to be_falsy } + end + end + describe '#slug' do it "is automatically generated" do expect(environment.slug).not_to be_nil From eccc187a70a6745ca02211648814c89ff390dfa3 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Mon, 5 Jun 2017 19:26:46 +0200 Subject: [PATCH 0042/1380] Additional Metrics of deployment tests --- ...dditional_metrics_deployment_query_spec.rb | 29 ++++ .../queries/additional_metrics_query_spec.rb | 143 +----------------- .../additional_metrics_shared_examples.rb | 143 ++++++++++++++++++ spec/support/prometheus/metric_builders.rb | 6 +- 4 files changed, 179 insertions(+), 142 deletions(-) create mode 100644 spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb create mode 100644 spec/support/prometheus/additional_metrics_shared_examples.rb diff --git a/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb b/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb new file mode 100644 index 00000000000..93a9ce38d80 --- /dev/null +++ b/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb @@ -0,0 +1,29 @@ +require 'spec_helper' + +describe Gitlab::Prometheus::Queries::AdditionalMetricsDeploymentQuery, lib: true do + include Prometheus::AdditionalMetricsQueryHelper + include Prometheus::MetricBuilders + + let(:metric_group_class) { Gitlab::Prometheus::MetricGroup } + let(:metric_class) { Gitlab::Prometheus::Metric } + + let(:client) { double('prometheus_client') } + let(:environment) { create(:environment, slug: 'environment-slug') } + let(:deployment) { create(:deployment, environment: environment) } + + subject(:query_result) { described_class.new(client).query(deployment.id) } + + around do |example| + Timecop.freeze { example.run } + end + + include_examples 'additional metrics query' do + it 'queries using specific time' do + expect(client).to receive(:query_range).with(anything, + start: (deployment.created_at - 30.minutes).to_f, + stop: (deployment.created_at + 30.minutes).to_f) + + expect(query_result).not_to be_nil + end + end +end diff --git a/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb b/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb index 2291c4d67bb..e5db1326597 100644 --- a/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb @@ -4,9 +4,6 @@ describe Gitlab::Prometheus::Queries::AdditionalMetricsQuery, lib: true do include Prometheus::AdditionalMetricsQueryHelper include Prometheus::MetricBuilders - let(:metric_group_class) { Gitlab::Prometheus::MetricGroup } - let(:metric_class) { Gitlab::Prometheus::Metric } - let(:client) { double('prometheus_client') } let(:environment) { create(:environment, slug: 'environment-slug') } @@ -16,142 +13,10 @@ describe Gitlab::Prometheus::Queries::AdditionalMetricsQuery, lib: true do Timecop.freeze { example.run } end - context 'with one group where two metrics is found' do - before do - allow(metric_group_class).to receive(:all).and_return([simple_metric_group]) - allow(client).to receive(:label_values).and_return(metric_names) - end - - context 'some queries return results' do - before do - allow(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result) - allow(client).to receive(:query_range).with('query_range_b', any_args).and_return(query_range_result) - allow(client).to receive(:query_range).with('query_range_empty', any_args).and_return([]) - end - - it 'return group data only for queries with results' do - expected = [ - { - group: 'name', - priority: 1, - metrics: [ - { - title: 'title', weight: nil, y_label: 'Values', queries: [ - { query_range: 'query_range_a', result: query_range_result }, - { query_range: 'query_range_b', label: 'label', unit: 'unit', result: query_range_result } - ] - } - ] - } - ] - - expect(query_result).to eq(expected) - end - end - end - - context 'with two groups with one metric each' do - let(:metrics) { [simple_metric(queries: [simple_query])] } - before do - allow(metric_group_class).to receive(:all).and_return( - [ - simple_metric_group('group_a', [simple_metric(queries: [simple_query])]), - simple_metric_group('group_b', [simple_metric(title: 'title_b', queries: [simple_query('b')])]) - ]) - allow(client).to receive(:label_values).and_return(metric_names) - end - - context 'both queries return results' do - before do - allow(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result) - allow(client).to receive(:query_range).with('query_range_b', any_args).and_return(query_range_result) - end - - it 'return group data both queries' do - expected = [ - { - group: 'group_a', - priority: 1, - metrics: [ - { - title: 'title', - weight: nil, - y_label: 'Values', - queries: [ - { - query_range: 'query_range_a', - result: [ - { - metric: {}, - values: [[1488758662.506, '0.00002996364761904785'], [1488758722.506, '0.00003090239047619091']] } - ] - } - ] - } - ] - }, - { - group: 'group_b', - priority: 1, - metrics: [ - { - title: 'title_b', - weight: nil, - y_label: 'Values', - queries: [ - { - query_range: 'query_range_b', result: [ - { - metric: {}, - values: [[1488758662.506, '0.00002996364761904785'], [1488758722.506, '0.00003090239047619091']] - } - ] - } - ] - } - ] - } - ] - - expect(query_result).to eq(expected) - end - end - - context 'one query returns result' do - before do - allow(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result) - allow(client).to receive(:query_range).with('query_range_b', any_args).and_return([]) - end - - it 'queries using specific time' do - expect(client).to receive(:query_range).with(anything, start: 8.hours.ago.to_f, stop: Time.now.to_f) - - expect(query_result).not_to be_nil - end - - it 'return group data only for query with results' do - expected = [ - { - group: 'group_a', - priority: 1, - metrics: [ - { - title: 'title', - weight: nil, - y_label: 'Values', - queries: [ - { - query_range: 'query_range_a', - result: query_range_result - } - ] - } - ] - } - ] - - expect(query_result).to eq(expected) - end + include_examples 'additional metrics query' do + it 'queries using specific time' do + expect(client).to receive(:query_range).with(anything, start: 8.hours.ago.to_f, stop: Time.now.to_f) + expect(query_result).not_to be_nil end end end diff --git a/spec/support/prometheus/additional_metrics_shared_examples.rb b/spec/support/prometheus/additional_metrics_shared_examples.rb new file mode 100644 index 00000000000..96a9e1f5049 --- /dev/null +++ b/spec/support/prometheus/additional_metrics_shared_examples.rb @@ -0,0 +1,143 @@ +RSpec.shared_examples 'additional metrics query' do + include Prometheus::MetricBuilders + + before do + allow(client).to receive(:label_values).and_return(metric_names) + allow(metric_group_class).to receive(:all).and_return([simple_metric_group(metrics: [simple_metric])]) + end + + let(:metric_group_class) { Gitlab::Prometheus::MetricGroup } + let(:metric_class) { Gitlab::Prometheus::Metric } + + context 'with one group where two metrics is found' do + before do + allow(metric_group_class).to receive(:all).and_return([simple_metric_group]) + end + + context 'some queries return results' do + before do + allow(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result) + allow(client).to receive(:query_range).with('query_range_b', any_args).and_return(query_range_result) + allow(client).to receive(:query_range).with('query_range_empty', any_args).and_return([]) + end + + it 'return group data only for queries with results' do + expected = [ + { + group: 'name', + priority: 1, + metrics: [ + { + title: 'title', weight: nil, y_label: 'Values', queries: [ + { query_range: 'query_range_a', result: query_range_result }, + { query_range: 'query_range_b', label: 'label', unit: 'unit', result: query_range_result } + ] + } + ] + } + ] + + expect(query_result).to eq(expected) + end + end + end + + context 'with two groups with one metric each' do + let(:metrics) { [simple_metric(queries: [simple_query])] } + before do + allow(metric_group_class).to receive(:all).and_return( + [ + simple_metric_group(name: 'group_a', metrics: [simple_metric(queries: [simple_query])]), + simple_metric_group(name: 'group_b', metrics: [simple_metric(title: 'title_b', queries: [simple_query('b')])]) + ]) + allow(client).to receive(:label_values).and_return(metric_names) + end + + context 'both queries return results' do + before do + allow(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result) + allow(client).to receive(:query_range).with('query_range_b', any_args).and_return(query_range_result) + end + + it 'return group data both queries' do + expected = [ + { + group: 'group_a', + priority: 1, + metrics: [ + { + title: 'title', + weight: nil, + y_label: 'Values', + queries: [ + { + query_range: 'query_range_a', + result: [ + { + metric: {}, + values: [[1488758662.506, '0.00002996364761904785'], [1488758722.506, '0.00003090239047619091']] } + ] + } + ] + } + ] + }, + { + group: 'group_b', + priority: 1, + metrics: [ + { + title: 'title_b', + weight: nil, + y_label: 'Values', + queries: [ + { + query_range: 'query_range_b', result: [ + { + metric: {}, + values: [[1488758662.506, '0.00002996364761904785'], [1488758722.506, '0.00003090239047619091']] + } + ] + } + ] + } + ] + } + ] + + expect(query_result).to eq(expected) + end + end + + context 'one query returns result' do + before do + allow(client).to receive(:query_range).with('query_range_a', any_args).and_return(query_range_result) + allow(client).to receive(:query_range).with('query_range_b', any_args).and_return([]) + end + + it 'return group data only for query with results' do + expected = [ + { + group: 'group_a', + priority: 1, + metrics: [ + { + title: 'title', + weight: nil, + y_label: 'Values', + queries: [ + { + query_range: 'query_range_a', + result: query_range_result + } + ] + } + ] + } + ] + + expect(query_result).to eq(expected) + end + end + end +end \ No newline at end of file diff --git a/spec/support/prometheus/metric_builders.rb b/spec/support/prometheus/metric_builders.rb index 2d54ecdfb5c..c57694bf7fd 100644 --- a/spec/support/prometheus/metric_builders.rb +++ b/spec/support/prometheus/metric_builders.rb @@ -8,7 +8,7 @@ module Prometheus [simple_query, simple_query('b', label: 'label', unit: 'unit')] end - def simple_metric(title: 'title', required_metrics: [], queries: []) + def simple_metric(title: 'title', required_metrics: [], queries: [simple_query]) Gitlab::Prometheus::Metric.new(title, required_metrics, nil, nil, queries) end @@ -20,8 +20,8 @@ module Prometheus ] end - def simple_metric_group(name = 'name', metrics = simple_metrics) + def simple_metric_group(name: 'name', metrics: simple_metrics) Gitlab::Prometheus::MetricGroup.new(name, 1, metrics) end end -end \ No newline at end of file +end From a3eb8264f31a79fc05113df4276d7dcf4e0bad75 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Mon, 5 Jun 2017 19:43:30 +0200 Subject: [PATCH 0043/1380] Refactor Metric tests to use more common code --- .../queries/matched_metrics_query_spec.rb | 20 ++++++++++++------- .../matched_metrics_query_helper.rb | 9 --------- spec/support/prometheus/metric_builders.rb | 6 +++--- 3 files changed, 16 insertions(+), 19 deletions(-) diff --git a/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb b/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb index 390fff568cc..34f11205878 100644 --- a/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb @@ -2,6 +2,7 @@ require 'spec_helper' describe Gitlab::Prometheus::Queries::MatchedMetricsQuery, lib: true do include Prometheus::MatchedMetricsQueryHelper + include Prometheus::MetricBuilders let(:metric_group_class) { Gitlab::Prometheus::MetricGroup } let(:metric_class) { Gitlab::Prometheus::Metric } @@ -83,30 +84,35 @@ describe Gitlab::Prometheus::Queries::MatchedMetricsQuery, lib: true do end end - context 'with two groups where only one metric is found' do + context 'with two groups where metrics are found in each group' do + let(:second_metric_group) { simple_metric_group(name: 'nameb', metrics: simple_metrics(added_metric_name: 'metric_c')) } + before do - allow(metric_group_class).to receive(:all).and_return([simple_metric_group, - simple_metric_group('nameb', simple_metrics('metric_c'))]) + allow(metric_group_class).to receive(:all).and_return([simple_metric_group, second_metric_group]) allow(client).to receive(:label_values).and_return('metric_c') end - context 'both metrics in the group pass requirements' do + context 'all metrics in both groups pass requirements' do before do allow(client).to receive(:series).and_return(series_info_with_environment('metric_c')) end it 'responds with one metrics as active and no missing requiremens' do - expect(subject.query).to eq([{ group: 'nameb', priority: 1, active_metrics: 1, metrics_missing_requirements: 0 }]) + expect(subject.query).to eq([ + { group: 'name', priority: 1, active_metrics: 1, metrics_missing_requirements: 0 }, + { group: 'nameb', priority: 1, active_metrics: 2, metrics_missing_requirements: 0 }]) end end - context 'no metris in group pass requirements' do + context 'no metrics in groups pass requirements' do before do allow(client).to receive(:series).and_return(series_info_without_environment) end it 'responds with one metrics as active and no missing requiremens' do - expect(subject.query).to eq([{ group: 'nameb', priority: 1, active_metrics: 0, metrics_missing_requirements: 1 }]) + expect(subject.query).to eq([ + { group: 'name', priority: 1, active_metrics: 0, metrics_missing_requirements: 1 }, + { group: 'nameb', priority: 1, active_metrics: 0, metrics_missing_requirements: 2 }]) end end end diff --git a/spec/support/prometheus/matched_metrics_query_helper.rb b/spec/support/prometheus/matched_metrics_query_helper.rb index 86e874fb295..0471a78e426 100644 --- a/spec/support/prometheus/matched_metrics_query_helper.rb +++ b/spec/support/prometheus/matched_metrics_query_helper.rb @@ -4,15 +4,6 @@ module Prometheus %w{metric_a metric_b} end - def simple_metrics(metric_name = 'metric_a') - [Gitlab::Prometheus::Metric.new('title', %W(#{metric_name} metric_b), nil, nil), - Gitlab::Prometheus::Metric.new('title', [metric_name], nil, nil)] - end - - def simple_metric_group(name = 'name', metrics = simple_metrics) - Gitlab::Prometheus::MetricGroup.new(name, 1, metrics) - end - def series_info_with_environment(*more_metrics) %w{metric_a metric_b}.concat(more_metrics).map { |metric_name| { '__name__' => metric_name, 'environment' => '' } } end diff --git a/spec/support/prometheus/metric_builders.rb b/spec/support/prometheus/metric_builders.rb index c57694bf7fd..4c0e01bd5f6 100644 --- a/spec/support/prometheus/metric_builders.rb +++ b/spec/support/prometheus/metric_builders.rb @@ -12,10 +12,10 @@ module Prometheus Gitlab::Prometheus::Metric.new(title, required_metrics, nil, nil, queries) end - def simple_metrics + def simple_metrics(added_metric_name: 'metric_a') [ - simple_metric(required_metrics: %w(metric_a metric_b), queries: simple_queries), - simple_metric(required_metrics: %w{metric_a}, queries: [simple_query('empty')]), + simple_metric(required_metrics: %W(#{added_metric_name} metric_b), queries: simple_queries), + simple_metric(required_metrics: [added_metric_name], queries: [simple_query('empty')]), simple_metric(required_metrics: %w{metric_c}) ] end From ffedc52eaa33a7a31d3a7b4893387e81163a3d5f Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Mon, 5 Jun 2017 20:11:22 +0200 Subject: [PATCH 0044/1380] Cleanup Additional Metrics tests --- ...dditional_metrics_deployment_query_spec.rb | 8 ----- .../queries/additional_metrics_query_spec.rb | 1 - .../queries/matched_metrics_query_spec.rb | 12 ++++++- .../additional_metrics_query_helper.rb | 31 ------------------- .../additional_metrics_shared_examples.rb | 12 +++++-- .../matched_metrics_query_helper.rb | 24 -------------- 6 files changed, 20 insertions(+), 68 deletions(-) delete mode 100644 spec/support/prometheus/additional_metrics_query_helper.rb delete mode 100644 spec/support/prometheus/matched_metrics_query_helper.rb diff --git a/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb b/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb index 93a9ce38d80..836f2be629f 100644 --- a/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb @@ -1,22 +1,14 @@ require 'spec_helper' describe Gitlab::Prometheus::Queries::AdditionalMetricsDeploymentQuery, lib: true do - include Prometheus::AdditionalMetricsQueryHelper include Prometheus::MetricBuilders - let(:metric_group_class) { Gitlab::Prometheus::MetricGroup } - let(:metric_class) { Gitlab::Prometheus::Metric } - let(:client) { double('prometheus_client') } let(:environment) { create(:environment, slug: 'environment-slug') } let(:deployment) { create(:deployment, environment: environment) } subject(:query_result) { described_class.new(client).query(deployment.id) } - around do |example| - Timecop.freeze { example.run } - end - include_examples 'additional metrics query' do it 'queries using specific time' do expect(client).to receive(:query_range).with(anything, diff --git a/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb b/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb index e5db1326597..6fbd2fd17d6 100644 --- a/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb @@ -1,7 +1,6 @@ require 'spec_helper' describe Gitlab::Prometheus::Queries::AdditionalMetricsQuery, lib: true do - include Prometheus::AdditionalMetricsQueryHelper include Prometheus::MetricBuilders let(:client) { double('prometheus_client') } diff --git a/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb b/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb index 34f11205878..2395675a247 100644 --- a/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb @@ -1,12 +1,22 @@ require 'spec_helper' describe Gitlab::Prometheus::Queries::MatchedMetricsQuery, lib: true do - include Prometheus::MatchedMetricsQueryHelper include Prometheus::MetricBuilders let(:metric_group_class) { Gitlab::Prometheus::MetricGroup } let(:metric_class) { Gitlab::Prometheus::Metric } + def series_info_with_environment(*more_metrics) + %w{metric_a metric_b}.concat(more_metrics).map { |metric_name| { '__name__' => metric_name, 'environment' => '' } } + end + let(:metric_names) { %w{metric_a metric_b} } + let(:series_info_without_environment) do + [{ '__name__' => 'metric_a' }, + { '__name__' => 'metric_b' }] + end + let(:partialy_empty_series_info) { [{ '__name__' => 'metric_a', 'environment' => '' }] } + let(:empty_series_info) { [] } + let(:client) { double('prometheus_client') } subject { described_class.new(client) } diff --git a/spec/support/prometheus/additional_metrics_query_helper.rb b/spec/support/prometheus/additional_metrics_query_helper.rb deleted file mode 100644 index 84cbc24a301..00000000000 --- a/spec/support/prometheus/additional_metrics_query_helper.rb +++ /dev/null @@ -1,31 +0,0 @@ -module Prometheus - module AdditionalMetricsQueryHelper - def metric_names - %w{metric_a metric_b} - end - - def query_result - [ - { - 'metric': {}, - 'value': [ - 1488772511.004, - '0.000041021495238095323' - ] - } - ] - end - - def query_range_result - [ - { - 'metric': {}, - 'values': [ - [1488758662.506, '0.00002996364761904785'], - [1488758722.506, '0.00003090239047619091'] - ] - } - ] - end - end -end diff --git a/spec/support/prometheus/additional_metrics_shared_examples.rb b/spec/support/prometheus/additional_metrics_shared_examples.rb index 96a9e1f5049..449a53664c1 100644 --- a/spec/support/prometheus/additional_metrics_shared_examples.rb +++ b/spec/support/prometheus/additional_metrics_shared_examples.rb @@ -1,14 +1,20 @@ RSpec.shared_examples 'additional metrics query' do include Prometheus::MetricBuilders + let(:metric_group_class) { Gitlab::Prometheus::MetricGroup } + let(:metric_class) { Gitlab::Prometheus::Metric } + + let(:metric_names) { %w{metric_a metric_b} } + + let(:query_range_result) do + [{ 'metric': {}, 'values': [[1488758662.506, '0.00002996364761904785'], [1488758722.506, '0.00003090239047619091']] }] + end + before do allow(client).to receive(:label_values).and_return(metric_names) allow(metric_group_class).to receive(:all).and_return([simple_metric_group(metrics: [simple_metric])]) end - let(:metric_group_class) { Gitlab::Prometheus::MetricGroup } - let(:metric_class) { Gitlab::Prometheus::Metric } - context 'with one group where two metrics is found' do before do allow(metric_group_class).to receive(:all).and_return([simple_metric_group]) diff --git a/spec/support/prometheus/matched_metrics_query_helper.rb b/spec/support/prometheus/matched_metrics_query_helper.rb deleted file mode 100644 index 0471a78e426..00000000000 --- a/spec/support/prometheus/matched_metrics_query_helper.rb +++ /dev/null @@ -1,24 +0,0 @@ -module Prometheus - module MatchedMetricsQueryHelper - def metric_names - %w{metric_a metric_b} - end - - def series_info_with_environment(*more_metrics) - %w{metric_a metric_b}.concat(more_metrics).map { |metric_name| { '__name__' => metric_name, 'environment' => '' } } - end - - def series_info_without_environment - [{ '__name__' => 'metric_a' }, - { '__name__' => 'metric_b' }] - end - - def partialy_empty_series_info - [{ '__name__' => 'metric_a', 'environment' => '' }] - end - - def empty_series_info - [] - end - end -end From 1b6ab2dffce29df53f57cd857720b9f77ab4a7ca Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Mon, 5 Jun 2017 21:00:57 +0200 Subject: [PATCH 0045/1380] Remove orig file + rubocop cleanup --- .../additional_metrics_deployment_query.rb | 2 -- .../queries/additional_metrics_query.rb | 5 ++--- lib/gitlab/prometheus_client.rb | 2 +- spec/db/production/settings.rb.orig | 16 ---------------- .../queries/matched_metrics_query_spec.rb | 9 +++++++-- .../additional_metrics_shared_examples.rb | 5 +++-- 6 files changed, 13 insertions(+), 26 deletions(-) delete mode 100644 spec/db/production/settings.rb.orig diff --git a/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb b/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb index 382052c298f..7693772bf81 100644 --- a/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb +++ b/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb @@ -1,6 +1,5 @@ module Gitlab::Prometheus::Queries class AdditionalMetricsDeploymentQuery < AdditionalMetricsQuery - def query(deployment_id) deployment = Deployment.find_by(id: deployment_id) query_context = { @@ -14,4 +13,3 @@ module Gitlab::Prometheus::Queries end end end - diff --git a/lib/gitlab/prometheus/queries/additional_metrics_query.rb b/lib/gitlab/prometheus/queries/additional_metrics_query.rb index d21a3978e25..7ef4ee3a91a 100644 --- a/lib/gitlab/prometheus/queries/additional_metrics_query.rb +++ b/lib/gitlab/prometheus/queries/additional_metrics_query.rb @@ -40,11 +40,11 @@ module Gitlab::Prometheus::Queries private def metric_with_any_queries(metric) - metric[:queries]&.count > 0 + metric[:queries]&.count&.> 0 end def group_with_any_metrics(group) - group[:metrics]&.count > 0 + group[:metrics]&.count&.> 0 end def query_with_result(query) @@ -64,7 +64,6 @@ module Gitlab::Prometheus::Queries query_with_result end - def available_metrics @available_metrics ||= client_label_values || [] end diff --git a/lib/gitlab/prometheus_client.rb b/lib/gitlab/prometheus_client.rb index f4ef4ff8ba4..aa94614bf18 100644 --- a/lib/gitlab/prometheus_client.rb +++ b/lib/gitlab/prometheus_client.rb @@ -29,7 +29,7 @@ module Gitlab end end - def label_values(name='__name__') + def label_values(name = '__name__') json_api_get("label/#{name}/values") end diff --git a/spec/db/production/settings.rb.orig b/spec/db/production/settings.rb.orig deleted file mode 100644 index 3cbb173c4cc..00000000000 --- a/spec/db/production/settings.rb.orig +++ /dev/null @@ -1,16 +0,0 @@ -require 'spec_helper' - -describe 'seed production settings', lib: true do - include StubENV - - context 'GITLAB_SHARED_RUNNERS_REGISTRATION_TOKEN is set in the environment' do - before do - stub_env('GITLAB_SHARED_RUNNERS_REGISTRATION_TOKEN', '013456789') - end - - it 'writes the token to the database' do - load(File.join(__dir__, '../../../db/fixtures/production/010_settings.rb')) - expect(ApplicationSetting.current.runners_registration_token).to eq('013456789') - end - end -end diff --git a/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb b/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb index 2395675a247..d2796ab72da 100644 --- a/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/matched_metrics_query_spec.rb @@ -9,6 +9,7 @@ describe Gitlab::Prometheus::Queries::MatchedMetricsQuery, lib: true do def series_info_with_environment(*more_metrics) %w{metric_a metric_b}.concat(more_metrics).map { |metric_name| { '__name__' => metric_name, 'environment' => '' } } end + let(:metric_names) { %w{metric_a metric_b} } let(:series_info_without_environment) do [{ '__name__' => 'metric_a' }, @@ -110,7 +111,9 @@ describe Gitlab::Prometheus::Queries::MatchedMetricsQuery, lib: true do it 'responds with one metrics as active and no missing requiremens' do expect(subject.query).to eq([ { group: 'name', priority: 1, active_metrics: 1, metrics_missing_requirements: 0 }, - { group: 'nameb', priority: 1, active_metrics: 2, metrics_missing_requirements: 0 }]) + { group: 'nameb', priority: 1, active_metrics: 2, metrics_missing_requirements: 0 } + ] + ) end end @@ -122,7 +125,9 @@ describe Gitlab::Prometheus::Queries::MatchedMetricsQuery, lib: true do it 'responds with one metrics as active and no missing requiremens' do expect(subject.query).to eq([ { group: 'name', priority: 1, active_metrics: 0, metrics_missing_requirements: 1 }, - { group: 'nameb', priority: 1, active_metrics: 0, metrics_missing_requirements: 2 }]) + { group: 'nameb', priority: 1, active_metrics: 0, metrics_missing_requirements: 2 } + ] + ) end end end diff --git a/spec/support/prometheus/additional_metrics_shared_examples.rb b/spec/support/prometheus/additional_metrics_shared_examples.rb index 449a53664c1..0581eab95a0 100644 --- a/spec/support/prometheus/additional_metrics_shared_examples.rb +++ b/spec/support/prometheus/additional_metrics_shared_examples.rb @@ -81,7 +81,8 @@ RSpec.shared_examples 'additional metrics query' do result: [ { metric: {}, - values: [[1488758662.506, '0.00002996364761904785'], [1488758722.506, '0.00003090239047619091']] } + values: [[1488758662.506, '0.00002996364761904785'], [1488758722.506, '0.00003090239047619091']] + } ] } ] @@ -146,4 +147,4 @@ RSpec.shared_examples 'additional metrics query' do end end end -end \ No newline at end of file +end From 336cef434372244b9f17bd1fd222e54f8b70979e Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Tue, 6 Jun 2017 11:07:29 +0200 Subject: [PATCH 0046/1380] Fix transient error in deployment test --- .../queries/additional_metrics_deployment_query_spec.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb b/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb index 836f2be629f..4909aec5a4d 100644 --- a/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/additional_metrics_deployment_query_spec.rb @@ -9,6 +9,10 @@ describe Gitlab::Prometheus::Queries::AdditionalMetricsDeploymentQuery, lib: tru subject(:query_result) { described_class.new(client).query(deployment.id) } + around do |example| + Timecop.freeze(Time.local(2008, 9, 1, 12, 0, 0)) { example.run } + end + include_examples 'additional metrics query' do it 'queries using specific time' do expect(client).to receive(:query_range).with(anything, From c0a66dbd2dd8b716e809938d20e7655d84595176 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Tue, 6 Jun 2017 11:16:15 +0200 Subject: [PATCH 0047/1380] Fix prometheus service tests --- .../project_services/prometheus_service_spec.rb | 5 +++-- spec/support/prometheus_helpers.rb | 13 +++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/spec/models/project_services/prometheus_service_spec.rb b/spec/models/project_services/prometheus_service_spec.rb index 1f9d3c07b51..b761567ad76 100644 --- a/spec/models/project_services/prometheus_service_spec.rb +++ b/spec/models/project_services/prometheus_service_spec.rb @@ -61,7 +61,7 @@ describe PrometheusService, models: true, caching: true do end it 'returns reactive data' do - is_expected.to eq(prometheus_data) + is_expected.to eq(prometheus_metrics_data) end end end @@ -82,7 +82,7 @@ describe PrometheusService, models: true, caching: true do end it 'returns reactive data' do - is_expected.to eq(prometheus_data.merge(deployment_time: deployment.created_at.to_i)) + is_expected.to eq(prometheus_metrics_data.merge(deployment_time: deployment.created_at.to_i)) end end end @@ -112,6 +112,7 @@ describe PrometheusService, models: true, caching: true do end it { expect(subject.to_json).to eq(prometheus_data.to_json) } + it { expect(subject.to_json).to eq(prometheus_data.to_json) } end [404, 500].each do |status| diff --git a/spec/support/prometheus_helpers.rb b/spec/support/prometheus_helpers.rb index e49902475da..4212be2cc88 100644 --- a/spec/support/prometheus_helpers.rb +++ b/spec/support/prometheus_helpers.rb @@ -96,6 +96,19 @@ module PrometheusHelpers end def prometheus_data(last_update: Time.now.utc) + { + success: true, + data: { + memory_values: prometheus_values_body('matrix').dig(:data, :result), + memory_current: prometheus_value_body('vector').dig(:data, :result), + cpu_values: prometheus_values_body('matrix').dig(:data, :result), + cpu_current: prometheus_value_body('vector').dig(:data, :result) + }, + last_update: last_update + } + end + + def prometheus_metrics_data(last_update: Time.now.utc) { success: true, metrics: { From c7a1da800ff6fa16db5de796a8f8d715ddd3b582 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Tue, 6 Jun 2017 14:40:03 +0200 Subject: [PATCH 0048/1380] Explicitly require format.json in prometheus_controller + add missing prometheus_controller tests! --- .../projects/deployments_controller.rb | 5 +- .../projects/prometheus_controller.rb | 18 ++++-- .../projects/prometheus_controller_spec.rb | 60 +++++++++++++++++++ 3 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 spec/controllers/projects/prometheus_controller_spec.rb diff --git a/app/controllers/projects/deployments_controller.rb b/app/controllers/projects/deployments_controller.rb index 29d94e2760a..acf5573935a 100644 --- a/app/controllers/projects/deployments_controller.rb +++ b/app/controllers/projects/deployments_controller.rb @@ -24,10 +24,11 @@ class Projects::DeploymentsController < Projects::ApplicationController def additional_metrics return render_404 unless deployment.has_additional_metrics? + metrics = deployment.additional_metrics - if metrics&.any? - render json: metrics, status: :ok + if metrics.any? + render json: metrics else head :no_content end diff --git a/app/controllers/projects/prometheus_controller.rb b/app/controllers/projects/prometheus_controller.rb index 0402be6f85c..4a39d13881e 100644 --- a/app/controllers/projects/prometheus_controller.rb +++ b/app/controllers/projects/prometheus_controller.rb @@ -3,17 +3,25 @@ class Projects::PrometheusController < Projects::ApplicationController before_action :require_prometheus_metrics! def active_metrics - matched_metrics = prometheus_service.reactive_query(Gitlab::Prometheus::Queries::MatchedMetricsQuery.name, &:itself) + matched_metrics = prometheus_service.reactive_query(Gitlab::Prometheus::Queries::MatchedMetricsQuery.name, &:itself) || {} - if matched_metrics - render json: matched_metrics, status: :ok - else - head :no_content + respond_to do |format| + format.json do + if matched_metrics.any? + render json: matched_metrics + else + head :no_content + end + end end end private + rescue_from(ActionController::UnknownFormat) do |e| + render_404 + end + def prometheus_service project.monitoring_service end diff --git a/spec/controllers/projects/prometheus_controller_spec.rb b/spec/controllers/projects/prometheus_controller_spec.rb new file mode 100644 index 00000000000..5e57b19e042 --- /dev/null +++ b/spec/controllers/projects/prometheus_controller_spec.rb @@ -0,0 +1,60 @@ +require('spec_helper') + +describe Projects::PrometheusController do + let(:user) { create(:user) } + let!(:project) { create(:empty_project) } + + let(:prometheus_service) { double('prometheus_service') } + + before do + allow(controller).to receive(:project).and_return(project) + allow(project).to receive(:monitoring_service).and_return(prometheus_service) + + project.add_master(user) + sign_in(user) + end + + describe 'GET #active_metrics' do + context 'when prometheus metrics are enabled' do + before do + allow(prometheus_service).to receive(:reactive_query) + end + + context 'when data is not present' do + it 'returns no content response' do + get :active_metrics, project_params(format: :json) + + expect(response).to have_http_status(204) + end + end + + context 'when data is available' do + let(:sample_response) { { some_data: 1 } } + + before do + allow(prometheus_service).to receive(:reactive_query).with(Gitlab::Prometheus::Queries::MatchedMetricsQuery.name) + .and_return(sample_response) + end + + it 'returns no content response' do + get :active_metrics, project_params(format: :json) + + expect(response).to have_http_status(200) + expect(json_response).to eq(sample_response.deep_stringify_keys) + end + end + + context 'when requesting non json response' do + it 'returns not found response' do + get :active_metrics, project_params + + expect(response).to have_http_status(404) + end + end + end + end + + def project_params(opts = {}) + opts.reverse_merge(namespace_id: project.namespace, project_id: project) + end +end \ No newline at end of file From ccf89acc7145bb129f5666108854daa71a022827 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Tue, 6 Jun 2017 16:07:33 +0200 Subject: [PATCH 0049/1380] expand Namespaces:: and refactoring yaml parsing out of MetricGroup class --- app/models/environment.rb | 2 +- .../prometheus/additional_metrics_parser.rb | 36 ++++++ lib/gitlab/prometheus/metric.rb | 31 ++--- lib/gitlab/prometheus/metric_group.rb | 41 ++----- lib/gitlab/prometheus/parsing_error.rb | 6 +- .../additional_metrics_deployment_query.rb | 28 +++-- .../additional_metrics_environment_query.rb | 21 ++++ .../queries/additional_metrics_query.rb | 82 ------------- .../prometheus/queries/deployment_query.rb | 42 ++++--- .../prometheus/queries/environment_query.rb | 34 ++--- .../queries/matched_metrics_query.rb | 116 +++++++++--------- .../queries/query_additional_metrics.rb | 72 +++++++++++ .../projects/prometheus_controller_spec.rb | 2 +- ...itional_metrics_environment_query_spec.rb} | 2 +- spec/models/environment_spec.rb | 2 +- spec/support/prometheus/metric_builders.rb | 2 +- 16 files changed, 281 insertions(+), 238 deletions(-) create mode 100644 lib/gitlab/prometheus/additional_metrics_parser.rb create mode 100644 lib/gitlab/prometheus/queries/additional_metrics_environment_query.rb delete mode 100644 lib/gitlab/prometheus/queries/additional_metrics_query.rb create mode 100644 lib/gitlab/prometheus/queries/query_additional_metrics.rb rename spec/lib/gitlab/prometheus/queries/{additional_metrics_query_spec.rb => additional_metrics_environment_query_spec.rb} (87%) diff --git a/app/models/environment.rb b/app/models/environment.rb index 7ab4a23ab16..8d98b02c05a 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -159,7 +159,7 @@ class Environment < ActiveRecord::Base def additional_metrics if has_additional_metrics? - project.monitoring_service.reactive_query(Gitlab::Prometheus::Queries::AdditionalMetricsQuery.name, self.id, &:itself) + project.monitoring_service.reactive_query(Gitlab::Prometheus::Queries::AdditionalMetricsEnvironmentQuery.name, self.id, &:itself) end end diff --git a/lib/gitlab/prometheus/additional_metrics_parser.rb b/lib/gitlab/prometheus/additional_metrics_parser.rb new file mode 100644 index 00000000000..eb168ce8f9c --- /dev/null +++ b/lib/gitlab/prometheus/additional_metrics_parser.rb @@ -0,0 +1,36 @@ +module Gitlab + module Prometheus + module AdditionalMetricsParser + extend self + + def load_groups_from_yaml + additional_metrics_raw.map(&method(:new)) + end + + private + + def metrics_from_list(list) + list.map { |entry| metric_from_entry(entry) } + end + + def metric_from_entry(entry) + missing_fields = [:title, :required_metrics, :weight, :queries].select { |key| !entry.has_key?(key) } + raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? + + Metric.new(entry[:title], entry[:required_metrics], entry[:weight], entry[:y_label], entry[:queries]) + end + + def group_from_entry(entry) + missing_fields = [:group, :priority, :metrics].select { |key| !entry.has_key?(key) } + raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? + + group = MetricGroup.new(entry[:group], entry[:priority]) + group.tap { |g| g.metrics = Metric.metrics_from_list(entry[:metrics]) } + end + + def additional_metrics_raw + @additional_metrics_raw ||= YAML.load_file(Rails.root.join('config/additional_metrics.yml'))&.map(&:deep_symbolize_keys).freeze + end + end + end +end diff --git a/lib/gitlab/prometheus/metric.rb b/lib/gitlab/prometheus/metric.rb index d7cd4237a7b..5155064317c 100644 --- a/lib/gitlab/prometheus/metric.rb +++ b/lib/gitlab/prometheus/metric.rb @@ -1,24 +1,15 @@ -module Gitlab::Prometheus - class Metric - attr_reader :group, :title, :required_metrics, :weight, :y_label, :queries +module Gitlab + module Prometheus + class Metric + attr_reader :group, :title, :required_metrics, :weight, :y_label, :queries - def initialize(title, required_metrics, weight, y_label, queries = []) - @title = title - @required_metrics = required_metrics - @weight = weight - @y_label = y_label || 'Values' - @queries = queries - end - - def self.metric_from_entry(entry) - missing_fields = [:title, :required_metrics, :weight, :queries].select { |key| !entry.has_key?(key) } - raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? - - Metric.new(entry[:title], entry[:required_metrics], entry[:weight], entry[:y_label], entry[:queries]) - end - - def self.metrics_from_list(list) - list.map { |entry| metric_from_entry(entry) } + def initialize(title, required_metrics, weight, y_label, queries = []) + @title = title + @required_metrics = required_metrics + @weight = weight + @y_label = y_label || 'Values' + @queries = queries + end end end end diff --git a/lib/gitlab/prometheus/metric_group.rb b/lib/gitlab/prometheus/metric_group.rb index 0dcd9dc0f36..c3b24dc1fa5 100644 --- a/lib/gitlab/prometheus/metric_group.rb +++ b/lib/gitlab/prometheus/metric_group.rb @@ -1,33 +1,18 @@ -module Gitlab::Prometheus - class MetricGroup - attr_reader :priority, :name - attr_accessor :metrics +module Gitlab + module Prometheus + class MetricGroup + attr_reader :priority, :name + attr_accessor :metrics - def initialize(name, priority, metrics = []) - @name = name - @priority = priority - @metrics = metrics - end + def initialize(name:, priority:, metrics: []) + @name = name + @priority = priority + @metrics = metrics + end - def self.all - load_groups_from_yaml - end - - def self.load_groups_from_yaml - additional_metrics_raw.map(&method(:group_from_entry)) - end - - def self.group_from_entry(entry) - missing_fields = [:group, :priority, :metrics].select { |key| !entry.has_key?(key) } - raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? - - group = MetricGroup.new(entry[:group], entry[:priority]) - group.metrics = Metric.metrics_from_list(entry[:metrics]) - group - end - - def self.additional_metrics_raw - @additional_metrics_raw ||= YAML.load_file(Rails.root.join('config/additional_metrics.yml'))&.map(&:deep_symbolize_keys).freeze + def self.all + AdditionalMetricsParser.load_groups_from_yaml + end end end end diff --git a/lib/gitlab/prometheus/parsing_error.rb b/lib/gitlab/prometheus/parsing_error.rb index 067ea7f878a..49cc0e16080 100644 --- a/lib/gitlab/prometheus/parsing_error.rb +++ b/lib/gitlab/prometheus/parsing_error.rb @@ -1,3 +1,5 @@ -module Gitlab::Prometheus - ParsingError = Class.new(StandardError) +module Gitlab + module Prometheus + ParsingError = Class.new(StandardError) + end end diff --git a/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb b/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb index 7693772bf81..cfe6bed188b 100644 --- a/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb +++ b/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb @@ -1,15 +1,21 @@ -module Gitlab::Prometheus::Queries - class AdditionalMetricsDeploymentQuery < AdditionalMetricsQuery - def query(deployment_id) - deployment = Deployment.find_by(id: deployment_id) - query_context = { - environment_slug: deployment.environment.slug, - environment_filter: %{container_name!="POD",environment="#{deployment.environment.slug}"}, - timeframe_start: (deployment.created_at - 30.minutes).to_f, - timeframe_end: (deployment.created_at + 30.minutes).to_f - } +module Gitlab + module Prometheus + module Queries + class AdditionalMetricsDeploymentQuery < BaseQuery + include QueryAdditionalMetrics - query_metrics(query_context) + def query(deployment_id) + deployment = Deployment.find_by(id: deployment_id) + query_context = { + environment_slug: deployment.environment.slug, + environment_filter: %{container_name!="POD",environment="#{deployment.environment.slug}"}, + timeframe_start: (deployment.created_at - 30.minutes).to_f, + timeframe_end: (deployment.created_at + 30.minutes).to_f + } + + query_metrics(query_context) + end + end end end end diff --git a/lib/gitlab/prometheus/queries/additional_metrics_environment_query.rb b/lib/gitlab/prometheus/queries/additional_metrics_environment_query.rb new file mode 100644 index 00000000000..e261988b234 --- /dev/null +++ b/lib/gitlab/prometheus/queries/additional_metrics_environment_query.rb @@ -0,0 +1,21 @@ +module Gitlab + module Prometheus + module Queries + class AdditionalMetricsEnvironmentQuery < BaseQuery + include QueryAdditionalMetrics + + def query(environment_id) + environment = Environment.find_by(id: environment_id) + query_context = { + environment_slug: environment.slug, + environment_filter: %{container_name!="POD",environment="#{environment.slug}"}, + timeframe_start: 8.hours.ago.to_f, + timeframe_end: Time.now.to_f + } + + query_metrics(query_context) + end + end + end + end +end diff --git a/lib/gitlab/prometheus/queries/additional_metrics_query.rb b/lib/gitlab/prometheus/queries/additional_metrics_query.rb deleted file mode 100644 index 7ef4ee3a91a..00000000000 --- a/lib/gitlab/prometheus/queries/additional_metrics_query.rb +++ /dev/null @@ -1,82 +0,0 @@ -module Gitlab::Prometheus::Queries - class AdditionalMetricsQuery < BaseQuery - def query(environment_id) - environment = Environment.find_by(id: environment_id) - query_context = { - environment_slug: environment.slug, - environment_filter: %{container_name!="POD",environment="#{environment.slug}"}, - timeframe_start: 8.hours.ago.to_f, - timeframe_end: Time.now.to_f - } - - query_metrics(query_context) - end - - protected - - def query_metrics(query_context) - query_processor = method(:process_query).curry[query_context] - - groups = matched_metrics.map do |group| - metrics = group.metrics.map do |metric| - { - title: metric.title, - weight: metric.weight, - y_label: metric.y_label, - queries: metric.queries.map(&query_processor).select(&method(:query_with_result)) - } - end - - { - group: group.name, - priority: group.priority, - metrics: metrics.select(&method(:metric_with_any_queries)) - } - end - - groups.select(&method(:group_with_any_metrics)) - end - - private - - def metric_with_any_queries(metric) - metric[:queries]&.count&.> 0 - end - - def group_with_any_metrics(group) - group[:metrics]&.count&.> 0 - end - - def query_with_result(query) - query[:result]&.any? do |item| - item&.[](:values)&.any? || item&.[](:value)&.any? - end - end - - def process_query(context, query) - query_with_result = query.dup - query_with_result[:result] = - if query.has_key?(:query_range) - client_query_range(query[:query_range] % context, start: context[:timeframe_start], stop: context[:timeframe_end]) - else - client_query(query[:query] % context, time: context[:timeframe_end]) - end - query_with_result - end - - def available_metrics - @available_metrics ||= client_label_values || [] - end - - def matched_metrics - result = Gitlab::Prometheus::MetricGroup.all.map do |group| - group.metrics.select! do |metric| - metric.required_metrics.all?(&available_metrics.method(:include?)) - end - group - end - - result.select { |group| group.metrics.any? } - end - end -end diff --git a/lib/gitlab/prometheus/queries/deployment_query.rb b/lib/gitlab/prometheus/queries/deployment_query.rb index 2cc08731f8d..be3527f0f72 100644 --- a/lib/gitlab/prometheus/queries/deployment_query.rb +++ b/lib/gitlab/prometheus/queries/deployment_query.rb @@ -1,26 +1,30 @@ -module Gitlab::Prometheus::Queries - class DeploymentQuery < BaseQuery - def query(deployment_id) - deployment = Deployment.find_by(id: deployment_id) - environment_slug = deployment.environment.slug +module Gitlab + module Prometheus + module Queries + class DeploymentQuery < BaseQuery + def query(deployment_id) + deployment = Deployment.find_by(id: deployment_id) + environment_slug = deployment.environment.slug - memory_query = raw_memory_usage_query(environment_slug) - memory_avg_query = %{avg(avg_over_time(container_memory_usage_bytes{container_name!="POD",environment="#{environment_slug}"}[30m]))} - cpu_query = raw_cpu_usage_query(environment_slug) - cpu_avg_query = %{avg(rate(container_cpu_usage_seconds_total{container_name!="POD",environment="#{environment_slug}"}[30m])) * 100} + memory_query = raw_memory_usage_query(environment_slug) + memory_avg_query = %{avg(avg_over_time(container_memory_usage_bytes{container_name!="POD",environment="#{environment_slug}"}[30m]))} + cpu_query = raw_cpu_usage_query(environment_slug) + cpu_avg_query = %{avg(rate(container_cpu_usage_seconds_total{container_name!="POD",environment="#{environment_slug}"}[30m])) * 100} - timeframe_start = (deployment.created_at - 30.minutes).to_f - timeframe_end = (deployment.created_at + 30.minutes).to_f + timeframe_start = (deployment.created_at - 30.minutes).to_f + timeframe_end = (deployment.created_at + 30.minutes).to_f - { - memory_values: client_query_range(memory_query, start: timeframe_start, stop: timeframe_end), - memory_before: client_query(memory_avg_query, time: deployment.created_at.to_f), - memory_after: client_query(memory_avg_query, time: timeframe_end), + { + memory_values: client_query_range(memory_query, start: timeframe_start, stop: timeframe_end), + memory_before: client_query(memory_avg_query, time: deployment.created_at.to_f), + memory_after: client_query(memory_avg_query, time: timeframe_end), - cpu_values: client_query_range(cpu_query, start: timeframe_start, stop: timeframe_end), - cpu_before: client_query(cpu_avg_query, time: deployment.created_at.to_f), - cpu_after: client_query(cpu_avg_query, time: timeframe_end) - } + cpu_values: client_query_range(cpu_query, start: timeframe_start, stop: timeframe_end), + cpu_before: client_query(cpu_avg_query, time: deployment.created_at.to_f), + cpu_after: client_query(cpu_avg_query, time: timeframe_end) + } + end + end end end end diff --git a/lib/gitlab/prometheus/queries/environment_query.rb b/lib/gitlab/prometheus/queries/environment_query.rb index 01d756d7284..9aa9da6d858 100644 --- a/lib/gitlab/prometheus/queries/environment_query.rb +++ b/lib/gitlab/prometheus/queries/environment_query.rb @@ -1,20 +1,24 @@ -module Gitlab::Prometheus::Queries - class EnvironmentQuery < BaseQuery - def query(environment_id) - environment = Environment.find_by(id: environment_id) - environment_slug = environment.slug - timeframe_start = 8.hours.ago.to_f - timeframe_end = Time.now.to_f +module Gitlab + module Prometheus + module Queries + class EnvironmentQuery < BaseQuery + def query(environment_id) + environment = Environment.find_by(id: environment_id) + environment_slug = environment.slug + timeframe_start = 8.hours.ago.to_f + timeframe_end = Time.now.to_f - memory_query = raw_memory_usage_query(environment_slug) - cpu_query = raw_cpu_usage_query(environment_slug) + memory_query = raw_memory_usage_query(environment_slug) + cpu_query = raw_cpu_usage_query(environment_slug) - { - memory_values: client_query_range(memory_query, start: timeframe_start, stop: timeframe_end), - memory_current: client_query(memory_query, time: timeframe_end), - cpu_values: client_query_range(cpu_query, start: timeframe_start, stop: timeframe_end), - cpu_current: client_query(cpu_query, time: timeframe_end) - } + { + memory_values: client_query_range(memory_query, start: timeframe_start, stop: timeframe_end), + memory_current: client_query(memory_query, time: timeframe_end), + cpu_values: client_query_range(cpu_query, start: timeframe_start, stop: timeframe_end), + cpu_current: client_query(cpu_query, time: timeframe_end) + } + end + end end end end diff --git a/lib/gitlab/prometheus/queries/matched_metrics_query.rb b/lib/gitlab/prometheus/queries/matched_metrics_query.rb index fc97bca486c..d4894c87f8d 100644 --- a/lib/gitlab/prometheus/queries/matched_metrics_query.rb +++ b/lib/gitlab/prometheus/queries/matched_metrics_query.rb @@ -1,74 +1,78 @@ -module Gitlab::Prometheus::Queries - class MatchedMetricsQuery < BaseQuery - MAX_QUERY_ITEMS = 40.freeze +module Gitlab + module Prometheus + module Queries + class MatchedMetricsQuery < BaseQuery + MAX_QUERY_ITEMS = 40.freeze - def query - groups_data.map do |group, data| - { - group: group.name, - priority: group.priority, - active_metrics: data[:active_metrics], - metrics_missing_requirements: data[:metrics_missing_requirements] - } - end - end + def query + groups_data.map do |group, data| + { + group: group.name, + priority: group.priority, + active_metrics: data[:active_metrics], + metrics_missing_requirements: data[:metrics_missing_requirements] + } + end + end - private + private - def groups_data - metrics_groups = groups_with_active_metrics(Gitlab::Prometheus::MetricGroup.all) - lookup = active_series_lookup(metrics_groups) + def groups_data + metrics_groups = groups_with_active_metrics(Gitlab::Prometheus::MetricGroup.all) + lookup = active_series_lookup(metrics_groups) - groups = {} + groups = {} - metrics_groups.each do |group| - groups[group] ||= { active_metrics: 0, metrics_missing_requirements: 0 } - active_metrics = group.metrics.count { |metric| metric.required_metrics.all?(&lookup.method(:has_key?)) } + metrics_groups.each do |group| + groups[group] ||= { active_metrics: 0, metrics_missing_requirements: 0 } + active_metrics = group.metrics.count { |metric| metric.required_metrics.all?(&lookup.method(:has_key?)) } - groups[group][:active_metrics] += active_metrics - groups[group][:metrics_missing_requirements] += group.metrics.count - active_metrics - end + groups[group][:active_metrics] += active_metrics + groups[group][:metrics_missing_requirements] += group.metrics.count - active_metrics + end - groups - end + groups + end - def active_series_lookup(metric_groups) - timeframe_start = 8.hours.ago - timeframe_end = Time.now + def active_series_lookup(metric_groups) + timeframe_start = 8.hours.ago + timeframe_end = Time.now - series = metric_groups.flat_map(&:metrics).flat_map(&:required_metrics).uniq + series = metric_groups.flat_map(&:metrics).flat_map(&:required_metrics).uniq - lookup = series.each_slice(MAX_QUERY_ITEMS).flat_map do |batched_series| - client_series(*batched_series, start: timeframe_start, stop: timeframe_end) - .select(&method(:has_matching_label)) - .map { |series_info| [series_info['__name__'], true] } - end - lookup.to_h - end + lookup = series.each_slice(MAX_QUERY_ITEMS).flat_map do |batched_series| + client_series(*batched_series, start: timeframe_start, stop: timeframe_end) + .select(&method(:has_matching_label)) + .map { |series_info| [series_info['__name__'], true] } + end + lookup.to_h + end - def has_matching_label(series_info) - series_info.key?('environment') - end + def has_matching_label(series_info) + series_info.key?('environment') + end - def available_metrics - @available_metrics ||= client_label_values || [] - end + def available_metrics + @available_metrics ||= client_label_values || [] + end - def filter_active_metrics(metric_group) - metric_group.metrics.select! do |metric| - metric.required_metrics.all?(&available_metrics.method(:include?)) - end - metric_group - end + def filter_active_metrics(metric_group) + metric_group.metrics.select! do |metric| + metric.required_metrics.all?(&available_metrics.method(:include?)) + end + metric_group + end - def groups_with_active_metrics(metric_groups) - metric_groups.map(&method(:filter_active_metrics)).select { |group| group.metrics.any? } - end + def groups_with_active_metrics(metric_groups) + metric_groups.map(&method(:filter_active_metrics)).select { |group| group.metrics.any? } + end - def metrics_with_required_series(metric_groups) - metric_groups.flat_map do |group| - group.metrics.select do |metric| - metric.required_metrics.all?(&available_metrics.method(:include?)) + def metrics_with_required_series(metric_groups) + metric_groups.flat_map do |group| + group.metrics.select do |metric| + metric.required_metrics.all?(&available_metrics.method(:include?)) + end + end end end end diff --git a/lib/gitlab/prometheus/queries/query_additional_metrics.rb b/lib/gitlab/prometheus/queries/query_additional_metrics.rb new file mode 100644 index 00000000000..46029a1889a --- /dev/null +++ b/lib/gitlab/prometheus/queries/query_additional_metrics.rb @@ -0,0 +1,72 @@ +module Gitlab + module Prometheus + module Queries + module QueryAdditionalMetrics + def query_metrics(query_context) + query_processor = method(:process_query).curry[query_context] + + groups = matched_metrics.map do |group| + metrics = group.metrics.map do |metric| + { + title: metric.title, + weight: metric.weight, + y_label: metric.y_label, + queries: metric.queries.map(&query_processor).select(&method(:query_with_result)) + } + end + + { + group: group.name, + priority: group.priority, + metrics: metrics.select(&method(:metric_with_any_queries)) + } + end + + groups.select(&method(:group_with_any_metrics)) + end + + private + + def metric_with_any_queries(metric) + metric[:queries]&.count&.> 0 + end + + def group_with_any_metrics(group) + group[:metrics]&.count&.> 0 + end + + def query_with_result(query) + query[:result]&.any? do |item| + item&.[](:values)&.any? || item&.[](:value)&.any? + end + end + + def process_query(context, query) + query_with_result = query.dup + query_with_result[:result] = + if query.has_key?(:query_range) + client_query_range(query[:query_range] % context, start: context[:timeframe_start], stop: context[:timeframe_end]) + else + client_query(query[:query] % context, time: context[:timeframe_end]) + end + query_with_result + end + + def available_metrics + @available_metrics ||= client_label_values || [] + end + + def matched_metrics + result = Gitlab::Prometheus::MetricGroup.all.map do |group| + group.metrics.select! do |metric| + metric.required_metrics.all?(&available_metrics.method(:include?)) + end + group + end + + result.select { |group| group.metrics.any? } + end + end + end + end +end diff --git a/spec/controllers/projects/prometheus_controller_spec.rb b/spec/controllers/projects/prometheus_controller_spec.rb index 5e57b19e042..7c976cfad83 100644 --- a/spec/controllers/projects/prometheus_controller_spec.rb +++ b/spec/controllers/projects/prometheus_controller_spec.rb @@ -57,4 +57,4 @@ describe Projects::PrometheusController do def project_params(opts = {}) opts.reverse_merge(namespace_id: project.namespace, project_id: project) end -end \ No newline at end of file +end diff --git a/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb b/spec/lib/gitlab/prometheus/queries/additional_metrics_environment_query_spec.rb similarity index 87% rename from spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb rename to spec/lib/gitlab/prometheus/queries/additional_metrics_environment_query_spec.rb index 6fbd2fd17d6..8e6e3bb5946 100644 --- a/spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb +++ b/spec/lib/gitlab/prometheus/queries/additional_metrics_environment_query_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe Gitlab::Prometheus::Queries::AdditionalMetricsQuery, lib: true do +describe Gitlab::Prometheus::Queries::AdditionalMetricsEnvironmentQuery, lib: true do include Prometheus::MetricBuilders let(:client) { double('prometheus_client') } diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index 12de9c9111b..e25d2bb6955 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -453,7 +453,7 @@ describe Environment, models: true do it 'returns the additional metrics from the deployment service' do expect(project.monitoring_service).to receive(:reactive_query) - .with(Gitlab::Prometheus::Queries::AdditionalMetricsQuery.name, environment.id) + .with(Gitlab::Prometheus::Queries::AdditionalMetricsEnvironmentQuery.name, environment.id) .and_return(:fake_metrics) is_expected.to eq(:fake_metrics) diff --git a/spec/support/prometheus/metric_builders.rb b/spec/support/prometheus/metric_builders.rb index 4c0e01bd5f6..cc733bfe1b4 100644 --- a/spec/support/prometheus/metric_builders.rb +++ b/spec/support/prometheus/metric_builders.rb @@ -21,7 +21,7 @@ module Prometheus end def simple_metric_group(name: 'name', metrics: simple_metrics) - Gitlab::Prometheus::MetricGroup.new(name, 1, metrics) + Gitlab::Prometheus::MetricGroup.new(name: name, priority: 1, metrics: metrics) end end end From 969b812433b6030b15b591ec5862daae1b707025 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Tue, 6 Jun 2017 19:35:28 +0200 Subject: [PATCH 0050/1380] Add schema matcher for non response objects + use schema to test additional metrics compliance --- .../additional_metrics_query_result.json | 58 +++++++++++++ spec/support/api/schema_matcher.rb | 16 +++- .../additional_metrics_shared_examples.rb | 85 ++++--------------- spec/support/prometheus/metric_builders.rb | 2 +- 4 files changed, 89 insertions(+), 72 deletions(-) create mode 100644 spec/fixtures/api/schemas/prometheus/additional_metrics_query_result.json diff --git a/spec/fixtures/api/schemas/prometheus/additional_metrics_query_result.json b/spec/fixtures/api/schemas/prometheus/additional_metrics_query_result.json new file mode 100644 index 00000000000..47b5d283b8c --- /dev/null +++ b/spec/fixtures/api/schemas/prometheus/additional_metrics_query_result.json @@ -0,0 +1,58 @@ +{ + "items": { + "properties": { + "group": { + "type": "string" + }, + "metrics": { + "items": { + "properties": { + "queries": { + "items": { + "properties": { + "query_range": { + "type": "string" + }, + "query": { + "type": "string" + }, + "result": { + "type": "any" + } + }, + "type": "object" + }, + "type": "array" + }, + "title": { + "type": "string" + }, + "weight": { + "type": "integer" + }, + "y_label": { + "type": "string" + } + }, + "type": "object" + }, + "required": [ + "metrics", + "title", + "weight" + ], + "type": "array" + }, + "priority": { + "type": "integer" + } + }, + "type": "object" + }, + "required": [ + "group", + "priority", + "metrics" + ], + "type": "array" +} \ No newline at end of file diff --git a/spec/support/api/schema_matcher.rb b/spec/support/api/schema_matcher.rb index e42d727672b..dff0dfba675 100644 --- a/spec/support/api/schema_matcher.rb +++ b/spec/support/api/schema_matcher.rb @@ -1,8 +1,16 @@ +def schema_path(schema) + schema_directory = "#{Dir.pwd}/spec/fixtures/api/schemas" + "#{schema_directory}/#{schema}.json" +end + RSpec::Matchers.define :match_response_schema do |schema, **options| match do |response| - schema_directory = "#{Dir.pwd}/spec/fixtures/api/schemas" - schema_path = "#{schema_directory}/#{schema}.json" - - JSON::Validator.validate!(schema_path, response.body, options) + JSON::Validator.validate!(schema_path(schema), response.body, options) + end +end + +RSpec::Matchers.define :match_schema do |schema, **options| + match do |data| + JSON::Validator.validate!(schema_path(schema), data, options) end end diff --git a/spec/support/prometheus/additional_metrics_shared_examples.rb b/spec/support/prometheus/additional_metrics_shared_examples.rb index 0581eab95a0..016e16fc8d4 100644 --- a/spec/support/prometheus/additional_metrics_shared_examples.rb +++ b/spec/support/prometheus/additional_metrics_shared_examples.rb @@ -34,7 +34,7 @@ RSpec.shared_examples 'additional metrics query' do priority: 1, metrics: [ { - title: 'title', weight: nil, y_label: 'Values', queries: [ + title: 'title', weight: 1, y_label: 'Values', queries: [ { query_range: 'query_range_a', result: query_range_result }, { query_range: 'query_range_b', label: 'label', unit: 'unit', result: query_range_result } ] @@ -43,6 +43,7 @@ RSpec.shared_examples 'additional metrics query' do } ] + expect(query_result).to match_schema('prometheus/additional_metrics_query_result') expect(query_result).to eq(expected) end end @@ -66,53 +67,16 @@ RSpec.shared_examples 'additional metrics query' do end it 'return group data both queries' do - expected = [ - { - group: 'group_a', - priority: 1, - metrics: [ - { - title: 'title', - weight: nil, - y_label: 'Values', - queries: [ - { - query_range: 'query_range_a', - result: [ - { - metric: {}, - values: [[1488758662.506, '0.00002996364761904785'], [1488758722.506, '0.00003090239047619091']] - } - ] - } - ] - } - ] - }, - { - group: 'group_b', - priority: 1, - metrics: [ - { - title: 'title_b', - weight: nil, - y_label: 'Values', - queries: [ - { - query_range: 'query_range_b', result: [ - { - metric: {}, - values: [[1488758662.506, '0.00002996364761904785'], [1488758722.506, '0.00003090239047619091']] - } - ] - } - ] - } - ] - } - ] + queries_with_result_a = { queries: [{ query_range: 'query_range_a', result: query_range_result }] } + queries_with_result_b = { queries: [{ query_range: 'query_range_b', result: query_range_result }] } - expect(query_result).to eq(expected) + expect(query_result).to match_schema('prometheus/additional_metrics_query_result') + + expect(query_result.count).to eq(2) + expect(query_result).to all(satisfy { |r| r[:metrics].count == 1 }) + + expect(query_result[0][:metrics].first).to include(queries_with_result_a) + expect(query_result[1][:metrics].first).to include(queries_with_result_b) end end @@ -123,27 +87,14 @@ RSpec.shared_examples 'additional metrics query' do end it 'return group data only for query with results' do - expected = [ - { - group: 'group_a', - priority: 1, - metrics: [ - { - title: 'title', - weight: nil, - y_label: 'Values', - queries: [ - { - query_range: 'query_range_a', - result: query_range_result - } - ] - } - ] - } - ] + queries_with_result = { queries: [{ query_range: 'query_range_a', result: query_range_result }] } - expect(query_result).to eq(expected) + expect(query_result).to match_schema('prometheus/additional_metrics_query_result') + + expect(query_result.count).to eq(1) + expect(query_result).to all(satisfy { |r| r[:metrics].count == 1 }) + + expect(query_result.first[:metrics].first).to include(queries_with_result) end end end diff --git a/spec/support/prometheus/metric_builders.rb b/spec/support/prometheus/metric_builders.rb index cc733bfe1b4..18378ec0145 100644 --- a/spec/support/prometheus/metric_builders.rb +++ b/spec/support/prometheus/metric_builders.rb @@ -9,7 +9,7 @@ module Prometheus end def simple_metric(title: 'title', required_metrics: [], queries: [simple_query]) - Gitlab::Prometheus::Metric.new(title, required_metrics, nil, nil, queries) + Gitlab::Prometheus::Metric.new(title, required_metrics, 1, nil, queries) end def simple_metrics(added_metric_name: 'metric_a') From a7e1205219387a6d24c8579994f73a33b3028010 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Wed, 7 Jun 2017 02:36:59 +0200 Subject: [PATCH 0051/1380] Use explicit instance of prometheus service and add access methods to it --- .../projects/deployments_controller.rb | 2 +- .../projects/prometheus_controller.rb | 14 ++--- app/models/deployment.rb | 13 ++-- app/models/environment.rb | 14 +++-- .../project_services/prometheus_service.rb | 12 +++- .../projects/deployments_controller_spec.rb | 62 +++++++++++++++++++ .../projects/prometheus_controller_spec.rb | 13 ++-- spec/models/deployment_spec.rb | 29 +++++++++ spec/models/environment_spec.rb | 10 ++- 9 files changed, 136 insertions(+), 33 deletions(-) diff --git a/app/controllers/projects/deployments_controller.rb b/app/controllers/projects/deployments_controller.rb index acf5573935a..e7d95e46b06 100644 --- a/app/controllers/projects/deployments_controller.rb +++ b/app/controllers/projects/deployments_controller.rb @@ -23,7 +23,7 @@ class Projects::DeploymentsController < Projects::ApplicationController end def additional_metrics - return render_404 unless deployment.has_additional_metrics? + return render_404 unless deployment.prometheus_service.present? metrics = deployment.additional_metrics diff --git a/app/controllers/projects/prometheus_controller.rb b/app/controllers/projects/prometheus_controller.rb index 4a39d13881e..9609fa44945 100644 --- a/app/controllers/projects/prometheus_controller.rb +++ b/app/controllers/projects/prometheus_controller.rb @@ -3,10 +3,10 @@ class Projects::PrometheusController < Projects::ApplicationController before_action :require_prometheus_metrics! def active_metrics - matched_metrics = prometheus_service.reactive_query(Gitlab::Prometheus::Queries::MatchedMetricsQuery.name, &:itself) || {} - respond_to do |format| format.json do + matched_metrics = prometheus_service.matched_metrics || {} + if matched_metrics.any? render json: matched_metrics else @@ -18,19 +18,15 @@ class Projects::PrometheusController < Projects::ApplicationController private - rescue_from(ActionController::UnknownFormat) do |e| + rescue_from(ActionController::UnknownFormat) do render_404 end def prometheus_service - project.monitoring_service - end - - def has_prometheus_metrics? - prometheus_service&.respond_to?(:reactive_query) + @prometheus_service ||= project.monitoring_services.reorder(nil).find_by(active: true, type: PrometheusService.name) end def require_prometheus_metrics! - render_404 unless has_prometheus_metrics? + render_404 unless prometheus_service.present? end end diff --git a/app/models/deployment.rb b/app/models/deployment.rb index f49410f18ae..fbb97de4af6 100644 --- a/app/models/deployment.rb +++ b/app/models/deployment.rb @@ -103,10 +103,6 @@ class Deployment < ActiveRecord::Base project.monitoring_service.present? end - def has_additional_metrics? - has_metrics? && project.monitoring_service&.respond_to?(:reactive_query) - end - def metrics return {} unless has_metrics? @@ -114,11 +110,16 @@ class Deployment < ActiveRecord::Base end def additional_metrics - return {} unless has_additional_metrics? - metrics = project.monitoring_service.reactive_query(Gitlab::Prometheus::Queries::AdditionalMetricsDeploymentQuery.name, id, &:itself) + return {} unless prometheus_service.present? + + metrics = prometheus_service.additional_deployment_metrics(self) metrics&.merge(deployment_time: created_at.to_i) || {} end + def prometheus_service + @prometheus_service ||= project.monitoring_services.reorder(nil).find_by(active: true, type: PrometheusService.name) + end + private def ref_path diff --git a/app/models/environment.rb b/app/models/environment.rb index 8d98b02c05a..9b7dc7f807e 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -149,20 +149,24 @@ class Environment < ActiveRecord::Base project.monitoring_service.present? && available? && last_deployment.present? end - def has_additional_metrics? - has_metrics? && project.monitoring_service&.respond_to?(:reactive_query) - end - def metrics project.monitoring_service.environment_metrics(self) if has_metrics? end + def has_additional_metrics? + prometheus_service.present? && available? && last_deployment.present? + end + def additional_metrics if has_additional_metrics? - project.monitoring_service.reactive_query(Gitlab::Prometheus::Queries::AdditionalMetricsEnvironmentQuery.name, self.id, &:itself) + prometheus_service.additional_environment_metrics(self) end end + def prometheus_service + @prometheus_service ||= project.monitoring_services.reorder(nil).find_by(active: true, type: PrometheusService.name) + end + # An environment name is not necessarily suitable for use in URLs, DNS # or other third-party contexts, so provide a slugified version. A slug has # the following properties: diff --git a/app/models/project_services/prometheus_service.rb b/app/models/project_services/prometheus_service.rb index d4d6611fd3b..9d736cb5dec 100644 --- a/app/models/project_services/prometheus_service.rb +++ b/app/models/project_services/prometheus_service.rb @@ -62,8 +62,16 @@ class PrometheusService < MonitoringService metrics&.merge(deployment_time: created_at.to_i) || {} end - def reactive_query(query_class, *args, &block) - with_reactive_cache(query_class, *args, &block) + def additional_environment_metrics(environment) + with_reactive_cache(Gitlab::Prometheus::Queries::AdditionalMetricsEnvironmentQuery.name, environment.id, &:itself) + end + + def additional_deployment_metrics(deployment) + with_reactive_cache(Gitlab::Prometheus::Queries::AdditionalMetricsDeploymentQuery.name, deployment.id, &:itself) + end + + def matched_metrics + additional_deployment_metrics(Gitlab::Prometheus::Queries::MatchedMetricsQuery.name, &:itself) end # Cache metrics for specific environment diff --git a/spec/controllers/projects/deployments_controller_spec.rb b/spec/controllers/projects/deployments_controller_spec.rb index 4c69443314d..26d92e787c4 100644 --- a/spec/controllers/projects/deployments_controller_spec.rb +++ b/spec/controllers/projects/deployments_controller_spec.rb @@ -108,6 +108,68 @@ describe Projects::DeploymentsController do end end + describe 'GET #additional_metrics' do + let(:deployment) { create(:deployment, project: project, environment: environment) } + + before do + allow(controller).to receive(:deployment).and_return(deployment) + end + context 'when metrics are disabled' do + before do + allow(deployment).to receive(:has_metrics?).and_return false + end + + it 'responds with not found' do + get :metrics, deployment_params(id: deployment.id) + + expect(response).to be_not_found + end + end + + context 'when metrics are enabled' do + let(:prometheus_service) { double('prometheus_service') } + + before do + allow(deployment).to receive(:prometheus_service).and_return(prometheus_service) + end + + context 'when environment has no metrics' do + before do + expect(deployment).to receive(:additional_metrics).and_return({}) + end + + it 'returns a empty response 204 response' do + get :additional_metrics, deployment_params(id: deployment.id) + expect(response).to have_http_status(204) + expect(response.body).to eq('') + end + end + + context 'when environment has some metrics' do + let(:empty_metrics) do + { + success: true, + metrics: {}, + last_update: 42 + } + end + + before do + expect(deployment).to receive(:additional_metrics).and_return(empty_metrics) + end + + it 'returns a metrics JSON document' do + get :additional_metrics, deployment_params(id: deployment.id) + + expect(response).to be_ok + expect(json_response['success']).to be(true) + expect(json_response['metrics']).to eq({}) + expect(json_response['last_update']).to eq(42) + end + end + end + end + def deployment_params(opts = {}) opts.reverse_merge(namespace_id: project.namespace, project_id: project, diff --git a/spec/controllers/projects/prometheus_controller_spec.rb b/spec/controllers/projects/prometheus_controller_spec.rb index 7c976cfad83..a994ac6409f 100644 --- a/spec/controllers/projects/prometheus_controller_spec.rb +++ b/spec/controllers/projects/prometheus_controller_spec.rb @@ -8,7 +8,7 @@ describe Projects::PrometheusController do before do allow(controller).to receive(:project).and_return(project) - allow(project).to receive(:monitoring_service).and_return(prometheus_service) + allow(controller).to receive(:prometheus_service).and_return(prometheus_service) project.add_master(user) sign_in(user) @@ -16,11 +16,11 @@ describe Projects::PrometheusController do describe 'GET #active_metrics' do context 'when prometheus metrics are enabled' do - before do - allow(prometheus_service).to receive(:reactive_query) - end - context 'when data is not present' do + before do + allow(prometheus_service).to receive(:matched_metrics).and_return({}) + end + it 'returns no content response' do get :active_metrics, project_params(format: :json) @@ -32,8 +32,7 @@ describe Projects::PrometheusController do let(:sample_response) { { some_data: 1 } } before do - allow(prometheus_service).to receive(:reactive_query).with(Gitlab::Prometheus::Queries::MatchedMetricsQuery.name) - .and_return(sample_response) + allow(prometheus_service).to receive(:matched_metrics).and_return(sample_response) end it 'returns no content response' do diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb index 4bda7d4314a..bbb7dbf0922 100644 --- a/spec/models/deployment_spec.rb +++ b/spec/models/deployment_spec.rb @@ -77,6 +77,35 @@ describe Deployment, models: true do end end + describe '#additional_metrics' do + let(:deployment) { create(:deployment) } + + subject { deployment.additional_metrics } + + context 'metrics are disabled' do + it { is_expected.to eq({}) } + end + + context 'metrics are enabled' do + let(:simple_metrics) do + { + success: true, + metrics: {}, + last_update: 42 + } + end + + let(:prometheus_service) { double('prometheus_service') } + + before do + allow(deployment).to receive(:prometheus_service).and_return(prometheus_service) + allow(prometheus_service).to receive(:additional_deployment_metrics).and_return(simple_metrics) + end + + it { is_expected.to eq(simple_metrics.merge({ deployment_time: deployment.created_at.to_i })) } + end + end + describe '#stop_action' do let(:build) { create(:ci_build) } diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index e25d2bb6955..8c9d093fc48 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -452,8 +452,8 @@ describe Environment, models: true do end it 'returns the additional metrics from the deployment service' do - expect(project.monitoring_service).to receive(:reactive_query) - .with(Gitlab::Prometheus::Queries::AdditionalMetricsEnvironmentQuery.name, environment.id) + expect(environment.prometheus_service).to receive(:additional_environment_metrics) + .with(environment) .and_return(:fake_metrics) is_expected.to eq(:fake_metrics) @@ -470,7 +470,11 @@ describe Environment, models: true do end describe '#has_additional_metrics??' do - subject { environment.has_metrics? } + subject { environment.has_additional_metrics? } + + before do + + end context 'when the enviroment is available' do context 'with a deployment service' do From a924152219c1367bf494f3f387d050ac3ff2d7d3 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Wed, 7 Jun 2017 04:07:47 +0200 Subject: [PATCH 0052/1380] Remove unecessary before block --- spec/models/environment_spec.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index 8c9d093fc48..c8709409cea 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -472,10 +472,6 @@ describe Environment, models: true do describe '#has_additional_metrics??' do subject { environment.has_additional_metrics? } - before do - - end - context 'when the enviroment is available' do context 'with a deployment service' do let(:project) { create(:prometheus_project) } From 6eb96b2019d392d906a64108dbe83b3ce7cce758 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Wed, 7 Jun 2017 12:41:06 +0200 Subject: [PATCH 0053/1380] Use `key?` instead of `has_key?` --- lib/gitlab/prometheus/additional_metrics_parser.rb | 4 ++-- lib/gitlab/prometheus/queries/query_additional_metrics.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/gitlab/prometheus/additional_metrics_parser.rb b/lib/gitlab/prometheus/additional_metrics_parser.rb index eb168ce8f9c..18eb79a44be 100644 --- a/lib/gitlab/prometheus/additional_metrics_parser.rb +++ b/lib/gitlab/prometheus/additional_metrics_parser.rb @@ -14,14 +14,14 @@ module Gitlab end def metric_from_entry(entry) - missing_fields = [:title, :required_metrics, :weight, :queries].select { |key| !entry.has_key?(key) } + missing_fields = [:title, :required_metrics, :weight, :queries].select { |key| !entry.key?(key) } raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? Metric.new(entry[:title], entry[:required_metrics], entry[:weight], entry[:y_label], entry[:queries]) end def group_from_entry(entry) - missing_fields = [:group, :priority, :metrics].select { |key| !entry.has_key?(key) } + missing_fields = [:group, :priority, :metrics].select { |key| !entry.key?(key) } raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? group = MetricGroup.new(entry[:group], entry[:priority]) diff --git a/lib/gitlab/prometheus/queries/query_additional_metrics.rb b/lib/gitlab/prometheus/queries/query_additional_metrics.rb index 46029a1889a..dd888b2bc1d 100644 --- a/lib/gitlab/prometheus/queries/query_additional_metrics.rb +++ b/lib/gitlab/prometheus/queries/query_additional_metrics.rb @@ -44,7 +44,7 @@ module Gitlab def process_query(context, query) query_with_result = query.dup query_with_result[:result] = - if query.has_key?(:query_range) + if query.key?(:query_range) client_query_range(query[:query_range] % context, start: context[:timeframe_start], stop: context[:timeframe_end]) else client_query(query[:query] % context, time: context[:timeframe_end]) From 172ff44d00ede290787cc1b5058d0157f5ee52b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Thu, 8 Jun 2017 13:06:34 +0800 Subject: [PATCH 0054/1380] supplement traditional chinese in hong kong translation Fix #33442 --- app/assets/javascripts/locale/zh_HK/app.js | 2 +- locale/zh_HK/gitlab.po | 674 ++++++++++++++++++++- locale/zh_HK/gitlab.po.time_stamp | 1 + 3 files changed, 656 insertions(+), 21 deletions(-) diff --git a/app/assets/javascripts/locale/zh_HK/app.js b/app/assets/javascripts/locale/zh_HK/app.js index fd0bcd988c5..9d4cfeea810 100644 --- a/app/assets/javascripts/locale/zh_HK/app.js +++ b/app/assets/javascripts/locale/zh_HK/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-05-04 19:24-0500","PO-Revision-Date":"2017-05-04 19:24-0500","Last-Translator":"HuangTao , 2017","Language-Team":"Chinese (Hong Kong) (https://www.transifex.com/gitlab-zh/teams/75177/zh_HK/)","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","Language":"zh_HK","Plural-Forms":"nplurals=1; plural=0;","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"ByAuthor|by":["作者:"],"Commit":["提交"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Deploy":["部署"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Introducing Cycle Analytics":["週期分析簡介"],"Last %d day":["最後 %d 天"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"New Issue":["新議題"],"Not available":["不可用"],"Not enough data":["數據不足"],"OpenedNDaysAgo|Opened":["開始於"],"Pipeline Health":["流水線健康指標"],"ProjectLifecycle|Stage":["項目生命週期"],"Read more":["了解更多"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合並請求"],"Showing %d event":["顯示 %d 個事件"],"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.":["編碼階段概述了從第一次提交到創建合併請求的時間。創建第壹個合並請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建一個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"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.":["評審階段概述了從創建合並請求到合併的時間。當創建第壹個合並請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合並請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了GitLab CI為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是一個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合並或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"You need permission.":["您需要相關的權限。"],"day":["天"]}}}; \ No newline at end of file +var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-07 17:36+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-07 10:18-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"About auto deploy":["關於自動部署"],"Activity":["活動"],"Add Changelog":["添加變更日誌"],"Add Contribution guide":["添加貢獻指南"],"Add License":["添加許可證"],"Add an SSH key to your profile to pull or push via SSH.":["添加一個用於推送或拉取的 SSH 秘鑰到您的個人資料中。"],"Add new directory":["添加新目錄"],"Archived project! Repository is read-only":["歸檔項目!存儲庫是只讀的"],"Branch":["分支"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["分支 %{branch_name} 已創建。如要設置自動部署, 請選擇 GitLab CI Yaml 模板並提交更改。%{link_to_autodeploy_doc}"],"Branches":["分支"],"ByAuthor|by":["作者:"],"CI configuration":["CI 配置"],"Changelog":["變更日誌"],"Charts":["圖表"],"CiStatusLabel|canceled":["已取消"],"CiStatusLabel|created":["已創建"],"CiStatusLabel|failed":["已失敗"],"CiStatusLabel|manual action":["手動操作"],"CiStatusLabel|passed":["已通過"],"CiStatusLabel|passed with warnings":["已通過但有警告"],"CiStatusLabel|pending":["等待中"],"CiStatusLabel|skipped":["已跳過"],"CiStatusLabel|waiting for manual action":["等待手動操作"],"CiStatusText|blocked":["已阻塞"],"CiStatusText|canceled":["已取消"],"CiStatusText|created":["已創建"],"CiStatusText|failed":["已失敗"],"CiStatusText|manual":["待手動"],"CiStatusText|passed":["已通過"],"CiStatusText|pending":["等待中"],"CiStatusText|skipped":["已跳過"],"CiStatus|running":["運行中"],"Commit":["提交"],"CommitMessage|Add %{file_name}":["添加 %{file_name}"],"Commits":["提交"],"Commits|History":["歷史"],"Compare":["比較"],"Contribution guide":["貢獻指南"],"Contributors":["貢獻者"],"Copy URL to clipboard":["複製URL到剪貼板"],"Copy commit SHA to clipboard":["複製提交 SHA 到剪貼板"],"Create New Directory":["創建新目錄"],"Create directory":["創建目錄"],"Create empty bare repository":["創建空的存儲庫"],"Create merge request":["創建合併請求"],"CreateNewFork|Fork":["派生"],"Custom notification events":["自定義通知事件"],"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}.":["自定義通知級別與參與級別相同。使用自定義通知級別,您只能收到所選定事件通知。想瞭解更多信息,請查看 %{notification_link}."],"Cycle Analytics":["週期分析"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Deploy":["部署"],"Directory name":["目錄名稱"],"Don't show again":["不再顯示"],"Download tar":["下載 tar"],"Download tar.bz2":["下載 tar.bz2"],"Download tar.gz":["下載 tar.gz"],"Download zip":["下載 zip"],"DownloadArtifacts|Download":["下載"],"DownloadSource|Download":["下載"],"Files":["文件"],"Find by path":["按路徑查找"],"Find file":["查找文件"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"ForkedFromProjectPath|Forked from":["離開"],"Forks":["派生"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Go to your fork":["跳轉到您的派生項目"],"GoToYourFork|Fork":["跳轉到您的"],"Home":["主頁"],"Housekeeping successfully started":["已開始維護"],"Import repository":["導入存儲庫"],"Introducing Cycle Analytics":["週期分析簡介"],"LFSStatus|Disabled":["禁用"],"LFSStatus|Enabled":["啟用"],"Last %d day":["最後 %d 天"],"Last Update":["最後更新"],"Last commit":["最後提交"],"Leave group":["離開群組"],"Leave project":["離開項目"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"MissingSSHKeyWarningLink|add an SSH key":["添加一個 SSH 公鑰"],"New Issue":["新議題"],"New branch":["新分支"],"New directory":["新目錄"],"New file":["新文件"],"New issue":["新議題"],"New merge request":["新合併請求"],"New snippet":["新代碼片段"],"New tag":["新標籤"],"No repository":["沒有存儲庫"],"Not available":["不可用"],"Not enough data":["數據不足"],"Notification events":["通知事件"],"NotificationEvent|Close issue":["關閉議題"],"NotificationEvent|Close merge request":["關閉合併請求"],"NotificationEvent|Failed pipeline":["流水線失敗"],"NotificationEvent|Merge merge request":["合併請求被合併"],"NotificationEvent|New issue":["新議題"],"NotificationEvent|New merge request":["新合併請求"],"NotificationEvent|New note":["新評論"],"NotificationEvent|Reassign issue":["重新指派議題"],"NotificationEvent|Reassign merge request":["重新指派合併請求"],"NotificationEvent|Reopen issue":["重新打開議題"],"NotificationEvent|Successful pipeline":["流水線成功完成"],"NotificationLevel|Custom":["自定義"],"NotificationLevel|Disabled":["禁用"],"NotificationLevel|Global":["全局"],"NotificationLevel|On mention":["提及"],"NotificationLevel|Participate":["參與"],"NotificationLevel|Watch":["關注"],"OpenedNDaysAgo|Opened":["開始於"],"Pipeline Health":["流水線健康指標"],"Project '%{project_name}' queued for deletion.":["項目 '%{project_name}' 已進入刪除隊列。"],"Project '%{project_name}' was successfully created.":["項目 '%{project_name}' 已創建完成。"],"Project '%{project_name}' was successfully updated.":["項目 '%{project_name}' 已更新完成。"],"Project '%{project_name}' will be deleted.":["項目 '%{project_name}' 已刪除。"],"Project access must be granted explicitly to each user.":["訪問項目必須明確授權給每個用戶。"],"Project export could not be deleted.":["無法刪除項目導出。"],"Project export has been deleted.":["項目導出已刪除。"],"Project export link has expired. Please generate a new export from your project settings.":["項目導出鏈接已過期。請從您的項目設置中生成新的導出。"],"Project export started. A download link will be sent by email.":["項目導出已開始。下載鏈接將通過電子郵件發送。"],"Project home":["項目主頁"],"ProjectFeature|Disabled":["禁用"],"ProjectFeature|Everyone with access":["任何人都可訪問"],"ProjectFeature|Only team members":["只有團隊成員"],"ProjectFileTree|Name":["名稱"],"ProjectLastActivity|Never":["從未"],"ProjectLifecycle|Stage":["項目生命週期"],"ProjectNetworkGraph|Graph":["分支圖"],"Read more":["了解更多"],"Readme":["自述文件"],"RefSwitcher|Branches":["分支"],"RefSwitcher|Tags":["標籤"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合並請求"],"Remind later":["稍後提醒"],"Remove project":["刪除項目"],"Request Access":["申請訪問"],"Search branches and tags":["搜索分支和標籤"],"Select Archive Format":["選擇下載格式"],"Set a password on your account to pull or push via %{protocol}":["為您的賬戶添加壹個用於推送或拉取的 %{protocol} 密碼。"],"Set up CI":["設置 CI"],"Set up Koding":["設置 Koding"],"Set up auto deploy":["設置自動部署"],"SetPasswordToCloneLink|set a password":["設置密碼"],"Showing %d event":["顯示 %d 個事件"],"Source code":["源代碼"],"StarProject|Star":["星標"],"Switch branch/tag":["切換分支/標籤"],"Tag":["標籤"],"Tags":["標籤"],"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.":["編碼階段概述了從第一次提交到創建合併請求的時間。創建第壹個合並請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"The fork relationship has been removed.":["派生關係已被刪除。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建一個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"The project can be accessed by any logged in user.":["該項目允許已登錄的用戶訪問。"],"The project can be accessed without any authentication.":["該項目允許任何人訪問。"],"The repository for this project does not exist.":["此項目的存儲庫不存在。"],"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.":["評審階段概述了從創建合並請求到合併的時間。當創建第壹個合並請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合並請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是一個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"This means you can not push code until you create an empty repository or import existing one.":["在創建一個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合並或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Timeago|%s days ago":["%s 天前"],"Timeago|%s days remaining":["剩餘 %s 天"],"Timeago|%s hours remaining":["剩餘 %s 小時"],"Timeago|%s minutes ago":["%s 分鐘前"],"Timeago|%s minutes remaining":["剩餘 %s 分鐘"],"Timeago|%s months ago":["%s 個月前"],"Timeago|%s months remaining":["剩餘 %s 月"],"Timeago|%s seconds remaining":["剩餘 %s 秒"],"Timeago|%s weeks ago":["%s 星期前"],"Timeago|%s weeks remaining":["剩餘 %s 星期"],"Timeago|%s years ago":["%s 年前"],"Timeago|%s years remaining":["剩餘 %s 年"],"Timeago|1 day remaining":["剩餘 1 天"],"Timeago|1 hour remaining":["剩餘 1 小時"],"Timeago|1 minute remaining":["剩餘 1 分鐘"],"Timeago|1 month remaining":["剩餘 1 個月"],"Timeago|1 week remaining":["剩餘 1 星期"],"Timeago|1 year remaining":["剩餘 1 年"],"Timeago|Past due":["逾期"],"Timeago|a day ago":["1 天前"],"Timeago|a month ago":["1 個月前"],"Timeago|a week ago":["1 星期前"],"Timeago|a while":["剛剛"],"Timeago|a year ago":["1 年前"],"Timeago|about %s hours ago":["大約 %s 小時前"],"Timeago|about a minute ago":["大約 1 分鐘前"],"Timeago|about an hour ago":["大約 1 小時前"],"Timeago|in %s days":["在 %s 天"],"Timeago|in %s hours":["在 %s 小時"],"Timeago|in %s minutes":["在 %s 分鐘"],"Timeago|in %s months":["在 %s 個月"],"Timeago|in %s seconds":["在 %s 秒"],"Timeago|in %s weeks":["在 %s 星期"],"Timeago|in %s years":["在 %s 年"],"Timeago|in 1 day":["在 1 天"],"Timeago|in 1 hour":["在 1 小時"],"Timeago|in 1 minute":["在 1 分鐘"],"Timeago|in 1 month":["在 1 月"],"Timeago|in 1 week":["在 1 星期"],"Timeago|in 1 year":["在 1 年"],"Timeago|less than a minute ago":["不到 1 分鐘前"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Unstar":["取消"],"Upload New File":["上傳新文件"],"Upload file":["上傳文件"],"Use your global notification setting":["使用全局通知設置"],"VisibilityLevel|Internal":["內部"],"VisibilityLevel|Private":["私有"],"VisibilityLevel|Public":["公開"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"Withdraw Access Request":["取消訪問請求"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["您將要刪除 %{project_name_with_namespace}。\\n已刪除的項目無法恢復!\\n妳確定繼續嗎?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["將刪除與源項目 %{forked_from_project} 的派生關係。妳確定繼續嗎?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["將 %{project_name_with_namespace} 轉義給另一個所有者。妳確定繼續嗎?"],"You can only add files when you are on a branch":["您只能在分支上添加文件"],"You must sign in to star a project":["您必須登錄才能對項目加星標"],"You need permission.":["您需要相關的權限。"],"You will not get any notifications via email":["您將不會收到任何通知郵件"],"You will only receive notifications for the events you choose":["您只會收到您選擇的事件通知"],"You will only receive notifications for threads you have participated in":["您只會收到您參與的主題的通知"],"You will receive notifications for any activity":["您將不會收到任何通知"],"You will receive notifications only for comments in which you were @mentioned":["您只会收到評論中提及(@)您的通知"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["在您的賬戶上 %{set_password_link} 之前, 您將無法通過 %{protocol} 拉取或推送代碼。"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["在您的個人資料中添加 %{add_ssh_key_link} 之前, 您將無法通過 SSH 拉取或推送代碼。"],"Your name":["您的名字"],"committed":["提交"],"day":["天"],"notification emails":["通知郵件"]}}}; \ No newline at end of file diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po index 6d56b2897fa..4d8ceac381e 100644 --- a/locale/zh_HK/gitlab.po +++ b/locale/zh_HK/gitlab.po @@ -1,30 +1,180 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gitlab package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy +# Huang Tao , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-05-04 19:24-0500\n" -"PO-Revision-Date: 2017-05-04 19:24-0500\n" -"Last-Translator: HuangTao , 2017\n" -"Language-Team: Chinese (Hong Kong) (https://www.transifex.com/gitlab-zh/teams/75177/zh_HK/)\n" +"POT-Creation-Date: 2017-06-07 17:36+0200\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_HK\n" +"PO-Revision-Date: 2017-06-07 10:18-0400\n" +"Last-Translator: Huang Tao \n" +"Language-Team: Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)\n" +"Language: zh-HK\n" "Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Zanata 3.9.6\n" + +msgid "About auto deploy" +msgstr "關於自動部署" + +msgid "Activity" +msgstr "活動" + +msgid "Add Changelog" +msgstr "添加變更日誌" + +msgid "Add Contribution guide" +msgstr "添加貢獻指南" + +msgid "Add License" +msgstr "添加許可證" + +msgid "Add an SSH key to your profile to pull or push via SSH." +msgstr "添加一個用於推送或拉取的 SSH 秘鑰到您的個人資料中。" + +msgid "Add new directory" +msgstr "添加新目錄" + +msgid "Archived project! Repository is read-only" +msgstr "歸檔項目!存儲庫是只讀的" + +msgid "Branch" +msgid_plural "Branches" +msgstr[0] "分支" + +msgid "" +"Branch %{branch_name} was created. To set up auto deploy, " +"choose a GitLab CI Yaml template and commit your changes. " +"%{link_to_autodeploy_doc}" +msgstr "" +"分支 %{branch_name} 已創建。如要設置自動部署, 請選擇 GitLab CI Yaml " +"模板並提交更改。%{link_to_autodeploy_doc}" + +msgid "Branches" +msgstr "分支" msgid "ByAuthor|by" msgstr "作者:" +msgid "CI configuration" +msgstr "CI 配置" + +msgid "Changelog" +msgstr "變更日誌" + +msgid "Charts" +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 "Commit" msgid_plural "Commits" msgstr[0] "提交" +msgid "CommitMessage|Add %{file_name}" +msgstr "添加 %{file_name}" + +msgid "Commits" +msgstr "提交" + +msgid "Commits|History" +msgstr "歷史" + +msgid "Compare" +msgstr "比較" + +msgid "Contribution guide" +msgstr "貢獻指南" + +msgid "Contributors" +msgstr "貢獻者" + +msgid "Copy URL to clipboard" +msgstr "複製URL到剪貼板" + +msgid "Copy commit SHA to clipboard" +msgstr "複製提交 SHA 到剪貼板" + +msgid "Create New Directory" +msgstr "創建新目錄" + +msgid "Create directory" +msgstr "創建目錄" + +msgid "Create empty bare repository" +msgstr "創建空的存儲庫" + +msgid "Create merge request" +msgstr "創建合併請求" + +msgid "CreateNewFork|Fork" +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 "" +"自定義通知級別與參與級別相同。使用自定義通知級別,您只能收到所選定事件通知。想瞭解更多信息,請查看 %{notification_link}." + +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." @@ -55,25 +205,97 @@ msgid "Deploy" msgid_plural "Deploys" msgstr[0] "部署" +msgid "Directory name" +msgstr "目錄名稱" + +msgid "Don't show again" +msgstr "不再顯示" + +msgid "Download tar" +msgstr "下載 tar" + +msgid "Download tar.bz2" +msgstr "下載 tar.bz2" + +msgid "Download tar.gz" +msgstr "下載 tar.gz" + +msgid "Download zip" +msgstr "下載 zip" + +msgid "DownloadArtifacts|Download" +msgstr "下載" + +msgid "DownloadSource|Download" +msgstr "下載" + +msgid "Files" +msgstr "文件" + +msgid "Find by path" +msgstr "按路徑查找" + +msgid "Find file" +msgstr "查找文件" + msgid "FirstPushedBy|First" msgstr "首次推送" msgid "FirstPushedBy|pushed by" msgstr "推送者:" +msgid "ForkedFromProjectPath|Forked from" +msgstr "離開" + +msgid "Forks" +msgstr "派生" + msgid "From issue creation until deploy to production" msgstr "從創建議題到部署到生產環境" msgid "From merge request merge until deploy to production" msgstr "從合併請求的合併到部署至生產環境" +msgid "Go to your fork" +msgstr "跳轉到您的派生項目" + +msgid "GoToYourFork|Fork" +msgstr "跳轉到您的" + +msgid "Home" +msgstr "主頁" + +msgid "Housekeeping successfully started" +msgstr "已開始維護" + +msgid "Import repository" +msgstr "導入存儲庫" + msgid "Introducing Cycle Analytics" msgstr "週期分析簡介" +msgid "LFSStatus|Disabled" +msgstr "禁用" + +msgid "LFSStatus|Enabled" +msgstr "啟用" + msgid "Last %d day" msgid_plural "Last %d days" msgstr[0] "最後 %d 天" +msgid "Last Update" +msgstr "最後更新" + +msgid "Last commit" +msgstr "最後提交" + +msgid "Leave group" +msgstr "離開群組" + +msgid "Leave project" +msgstr "離開項目" + msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" msgstr[0] "最多顯示 %d 個事件" @@ -81,28 +303,168 @@ msgstr[0] "最多顯示 %d 個事件" msgid "Median" msgstr "中位數" +msgid "MissingSSHKeyWarningLink|add an SSH key" +msgstr "添加一個 SSH 公鑰" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "新議題" +msgid "New branch" +msgstr "新分支" + +msgid "New directory" +msgstr "新目錄" + +msgid "New file" +msgstr "新文件" + +msgid "New issue" +msgstr "新議題" + +msgid "New merge request" +msgstr "新合併請求" + +msgid "New snippet" +msgstr "新代碼片段" + +msgid "New tag" +msgstr "新標籤" + +msgid "No repository" +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 "OpenedNDaysAgo|Opened" msgstr "開始於" msgid "Pipeline Health" msgstr "流水線健康指標" +msgid "Project '%{project_name}' queued for deletion." +msgstr "項目 '%{project_name}' 已進入刪除隊列。" + +msgid "Project '%{project_name}' was successfully created." +msgstr "項目 '%{project_name}' 已創建完成。" + +msgid "Project '%{project_name}' was successfully updated." +msgstr "項目 '%{project_name}' 已更新完成。" + +msgid "Project '%{project_name}' will be deleted." +msgstr "項目 '%{project_name}' 已刪除。" + +msgid "Project access must be granted explicitly to each user." +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 "Project home" +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 "Read more" msgstr "了解更多" +msgid "Readme" +msgstr "自述文件" + +msgid "RefSwitcher|Branches" +msgstr "分支" + +msgid "RefSwitcher|Tags" +msgstr "標籤" + msgid "Related Commits" msgstr "相關的提交" @@ -121,10 +483,56 @@ msgstr "相關的合併請求" msgid "Related Merged Requests" msgstr "相關已合併的合並請求" +msgid "Remind later" +msgstr "稍後提醒" + +msgid "Remove project" +msgstr "刪除項目" + +msgid "Request Access" +msgstr "申請訪問" + +msgid "Search branches and tags" +msgstr "搜索分支和標籤" + +msgid "Select Archive Format" +msgstr "選擇下載格式" + +msgid "Set a password on your account to pull or push via %{protocol}" +msgstr "為您的賬戶添加壹個用於推送或拉取的 %{protocol} 密碼。" + +msgid "Set up CI" +msgstr "設置 CI" + +msgid "Set up Koding" +msgstr "設置 Koding" + +msgid "Set up auto deploy" +msgstr "設置自動部署" + +msgid "SetPasswordToCloneLink|set a password" +msgstr "設置密碼" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "顯示 %d 個事件" +msgid "Source code" +msgstr "源代碼" + +msgid "StarProject|Star" +msgstr "星標" + +msgid "Switch branch/tag" +msgstr "切換分支/標籤" + +msgid "Tag" +msgid_plural "Tags" +msgstr[0] "標籤" + +msgid "Tags" +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 " @@ -134,6 +542,9 @@ 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. " @@ -145,16 +556,25 @@ 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." +"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 " +"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 " @@ -163,25 +583,30 @@ 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." +"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 "測試階段概述了GitLab CI為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。" +msgstr "測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。" 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." +"between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 =" +" 6." msgstr "中位數是一個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。" +msgid "" +"This means you can not push code until you create an empty repository or " +"import existing one." +msgstr "在創建一個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。" + msgid "Time before an issue gets scheduled" msgstr "議題被列入日程表的時間" @@ -194,6 +619,129 @@ msgstr "從創建合併請求到被合並或關閉的時間" msgid "Time until first merge request" msgstr "創建第壹個合併請求之前的時間" +msgid "Timeago|%s days ago" +msgstr "%s 天前" + +msgid "Timeago|%s days remaining" +msgstr "剩餘 %s 天" + +msgid "Timeago|%s hours remaining" +msgstr "剩餘 %s 小時" + +msgid "Timeago|%s minutes ago" +msgstr "%s 分鐘前" + +msgid "Timeago|%s minutes remaining" +msgstr "剩餘 %s 分鐘" + +msgid "Timeago|%s months ago" +msgstr "%s 個月前" + +msgid "Timeago|%s months remaining" +msgstr "剩餘 %s 月" + +msgid "Timeago|%s seconds remaining" +msgstr "剩餘 %s 秒" + +msgid "Timeago|%s weeks ago" +msgstr "%s 星期前" + +msgid "Timeago|%s weeks remaining" +msgstr "剩餘 %s 星期" + +msgid "Timeago|%s years ago" +msgstr "%s 年前" + +msgid "Timeago|%s years remaining" +msgstr "剩餘 %s 年" + +msgid "Timeago|1 day remaining" +msgstr "剩餘 1 天" + +msgid "Timeago|1 hour remaining" +msgstr "剩餘 1 小時" + +msgid "Timeago|1 minute remaining" +msgstr "剩餘 1 分鐘" + +msgid "Timeago|1 month remaining" +msgstr "剩餘 1 個月" + +msgid "Timeago|1 week remaining" +msgstr "剩餘 1 星期" + +msgid "Timeago|1 year remaining" +msgstr "剩餘 1 年" + +msgid "Timeago|Past due" +msgstr "逾期" + +msgid "Timeago|a day ago" +msgstr "1 天前" + +msgid "Timeago|a month ago" +msgstr "1 個月前" + +msgid "Timeago|a week ago" +msgstr "1 星期前" + +msgid "Timeago|a while" +msgstr "剛剛" + +msgid "Timeago|a year ago" +msgstr "1 年前" + +msgid "Timeago|about %s hours ago" +msgstr "大約 %s 小時前" + +msgid "Timeago|about a minute ago" +msgstr "大約 1 分鐘前" + +msgid "Timeago|about an hour ago" +msgstr "大約 1 小時前" + +msgid "Timeago|in %s days" +msgstr "在 %s 天" + +msgid "Timeago|in %s hours" +msgstr "在 %s 小時" + +msgid "Timeago|in %s minutes" +msgstr "在 %s 分鐘" + +msgid "Timeago|in %s months" +msgstr "在 %s 個月" + +msgid "Timeago|in %s seconds" +msgstr "在 %s 秒" + +msgid "Timeago|in %s weeks" +msgstr "在 %s 星期" + +msgid "Timeago|in %s years" +msgstr "在 %s 年" + +msgid "Timeago|in 1 day" +msgstr "在 1 天" + +msgid "Timeago|in 1 hour" +msgstr "在 1 小時" + +msgid "Timeago|in 1 minute" +msgstr "在 1 分鐘" + +msgid "Timeago|in 1 month" +msgstr "在 1 月" + +msgid "Timeago|in 1 week" +msgstr "在 1 星期" + +msgid "Timeago|in 1 year" +msgstr "在 1 年" + +msgid "Timeago|less than a minute ago" +msgstr "不到 1 分鐘前" + msgid "Time|hr" msgid_plural "Time|hrs" msgstr[0] "小時" @@ -211,15 +759,101 @@ msgstr "總時間" msgid "Total test time for all commits/merges" msgstr "所有提交和合併的總測試時間" +msgid "Unstar" +msgstr "取消" + +msgid "Upload New File" +msgstr "上傳新文件" + +msgid "Upload file" +msgstr "上傳文件" + +msgid "Use your global notification setting" +msgstr "使用全局通知設置" + +msgid "VisibilityLevel|Internal" +msgstr "內部" + +msgid "VisibilityLevel|Private" +msgstr "私有" + +msgid "VisibilityLevel|Public" +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 "Withdraw Access Request" +msgstr "取消訪問請求" + +msgid "" +"You are going to remove %{project_name_with_namespace}.\n" +"Removed project CANNOT be restored!\n" +"Are you ABSOLUTELY sure?" +msgstr "您將要刪除 %{project_name_with_namespace}。\n" +"已刪除的項目無法恢復!\n" +"妳確定繼續嗎?" + +msgid "" +"You are going to remove the fork relationship to source project " +"%{forked_from_project}. Are you ABSOLUTELY sure?" +msgstr "將刪除與源項目 %{forked_from_project} 的派生關係。妳確定繼續嗎?" + +msgid "" +"You are going to transfer %{project_name_with_namespace} to another owner. " +"Are you ABSOLUTELY sure?" +msgstr "將 %{project_name_with_namespace} 轉義給另一個所有者。妳確定繼續嗎?" + +msgid "You can only add files when you are on a branch" +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 "在您的賬戶上 %{set_password_link} 之前, 您將無法通過 %{protocol} 拉取或推送代碼。" + +msgid "" +"You won't be able to pull or push project code via SSH until you " +"%{add_ssh_key_link} to your profile" +msgstr "在您的個人資料中添加 %{add_ssh_key_link} 之前, 您將無法通過 SSH 拉取或推送代碼。" + +msgid "Your name" +msgstr "您的名字" + +msgid "committed" +msgstr "提交" + msgid "day" msgid_plural "days" msgstr[0] "天" + +msgid "notification emails" +msgstr "通知郵件" + diff --git a/locale/zh_HK/gitlab.po.time_stamp b/locale/zh_HK/gitlab.po.time_stamp index e69de29bb2d..0519ecba6ea 100644 --- a/locale/zh_HK/gitlab.po.time_stamp +++ b/locale/zh_HK/gitlab.po.time_stamp @@ -0,0 +1 @@ + \ No newline at end of file From 6f12c372f5856390dabf178c25c417b6cb34d3f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Thu, 8 Jun 2017 13:21:02 +0800 Subject: [PATCH 0055/1380] add changelog of supplement traditional chinese in hong kong translation --- ...t_traditional_chinese_in_hong_kong_translation_of_i18n.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml diff --git a/changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml b/changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml new file mode 100644 index 00000000000..a5eb71b63c6 --- /dev/null +++ b/changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml @@ -0,0 +1,4 @@ +--- +title: Supplement Traditional Chinese in Hong Kong translation of Project Page & Repository Page +merge_request: 11995 +author:Huang Tao From f78fd3de5d55830c84f25cfd50d399e7ddaddf30 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Thu, 8 Jun 2017 12:29:53 +0200 Subject: [PATCH 0056/1380] Fix Additional metrics filtering + remove test button that was leftover after a bad merge --- app/models/project_services/prometheus_service.rb | 6 +++++- app/views/projects/services/_form.html.haml | 1 - lib/gitlab/prometheus/additional_metrics_parser.rb | 4 ++-- lib/gitlab/prometheus/metric_group.rb | 2 +- lib/gitlab/prometheus/queries/query_additional_metrics.rb | 2 +- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/models/project_services/prometheus_service.rb b/app/models/project_services/prometheus_service.rb index 1c4ae18c6ca..d81fec3514f 100644 --- a/app/models/project_services/prometheus_service.rb +++ b/app/models/project_services/prometheus_service.rb @@ -72,7 +72,11 @@ class PrometheusService < MonitoringService end def matched_metrics - additional_deployment_metrics(Gitlab::Prometheus::Queries::MatchedMetricsQuery.name, &:itself) + with_reactive_cache(Gitlab::Prometheus::Queries::MatchedMetricsQuery.name, &:itself) + end + + def with_reactive_cache(*args, &block) + yield calculate_reactive_cache(*args) end # Cache metrics for specific environment diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml index cb3e1543fde..6dffc026392 100644 --- a/app/views/projects/services/_form.html.haml +++ b/app/views/projects/services/_form.html.haml @@ -22,7 +22,6 @@ - disabled_class = 'disabled' - disabled_title = @service.disabled_title - = link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service), class: "btn #{disabled_class}", title: disabled_title = link_to 'Cancel', namespace_project_settings_integrations_path(@project.namespace, @project), class: 'btn btn-cancel' - if lookup_context.template_exists?('show', "projects/services/#{@service.to_param}", true) diff --git a/lib/gitlab/prometheus/additional_metrics_parser.rb b/lib/gitlab/prometheus/additional_metrics_parser.rb index 18eb79a44be..694001605ef 100644 --- a/lib/gitlab/prometheus/additional_metrics_parser.rb +++ b/lib/gitlab/prometheus/additional_metrics_parser.rb @@ -4,7 +4,7 @@ module Gitlab extend self def load_groups_from_yaml - additional_metrics_raw.map(&method(:new)) + additional_metrics_raw.map(&method(:group_from_entry)) end private @@ -25,7 +25,7 @@ module Gitlab raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? group = MetricGroup.new(entry[:group], entry[:priority]) - group.tap { |g| g.metrics = Metric.metrics_from_list(entry[:metrics]) } + group.tap { |g| g.metrics = metrics_from_list(entry[:metrics]) } end def additional_metrics_raw diff --git a/lib/gitlab/prometheus/metric_group.rb b/lib/gitlab/prometheus/metric_group.rb index c3b24dc1fa5..12bdf407ce0 100644 --- a/lib/gitlab/prometheus/metric_group.rb +++ b/lib/gitlab/prometheus/metric_group.rb @@ -4,7 +4,7 @@ module Gitlab attr_reader :priority, :name attr_accessor :metrics - def initialize(name:, priority:, metrics: []) + def initialize(name, priority, metrics = []) @name = name @priority = priority @metrics = metrics diff --git a/lib/gitlab/prometheus/queries/query_additional_metrics.rb b/lib/gitlab/prometheus/queries/query_additional_metrics.rb index dd888b2bc1d..a5a401f84cd 100644 --- a/lib/gitlab/prometheus/queries/query_additional_metrics.rb +++ b/lib/gitlab/prometheus/queries/query_additional_metrics.rb @@ -37,7 +37,7 @@ module Gitlab def query_with_result(query) query[:result]&.any? do |item| - item&.[](:values)&.any? || item&.[](:value)&.any? + item&.[]('values')&.any? || item&.[]('value')&.any? end end From 0e7e7c2f2bd0e9c913cda438826a60e761130271 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Fri, 9 Jun 2017 12:43:12 +0200 Subject: [PATCH 0057/1380] Test Additional metrics parser and fix query checking tests --- .../project_services/prometheus_service.rb | 4 - .../prometheus/additional_metrics_parser.rb | 15 +- .../queries/query_additional_metrics.rb | 5 +- .../additional_metrics_parser_spec.rb | 250 ++++++++++++++++++ spec/support/prometheus/metric_builders.rb | 2 +- 5 files changed, 265 insertions(+), 11 deletions(-) create mode 100644 spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb diff --git a/app/models/project_services/prometheus_service.rb b/app/models/project_services/prometheus_service.rb index d81fec3514f..c9df678f97e 100644 --- a/app/models/project_services/prometheus_service.rb +++ b/app/models/project_services/prometheus_service.rb @@ -75,10 +75,6 @@ class PrometheusService < MonitoringService with_reactive_cache(Gitlab::Prometheus::Queries::MatchedMetricsQuery.name, &:itself) end - def with_reactive_cache(*args, &block) - yield calculate_reactive_cache(*args) - end - # Cache metrics for specific environment def calculate_reactive_cache(query_class_name, *args) return unless active? && project && !project.pending_delete? diff --git a/lib/gitlab/prometheus/additional_metrics_parser.rb b/lib/gitlab/prometheus/additional_metrics_parser.rb index 694001605ef..9bd41b99d81 100644 --- a/lib/gitlab/prometheus/additional_metrics_parser.rb +++ b/lib/gitlab/prometheus/additional_metrics_parser.rb @@ -14,22 +14,29 @@ module Gitlab end def metric_from_entry(entry) - missing_fields = [:title, :required_metrics, :weight, :queries].select { |key| !entry.key?(key) } + required_fields = [:title, :required_metrics, :weight, :queries] + missing_fields = required_fields.select { |key| entry[key].nil? } raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? Metric.new(entry[:title], entry[:required_metrics], entry[:weight], entry[:y_label], entry[:queries]) end def group_from_entry(entry) - missing_fields = [:group, :priority, :metrics].select { |key| !entry.key?(key) } - raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? + required_fields = [:group, :priority, :metrics] + missing_fields = required_fields.select { |key| entry[key].nil? } + + raise ParsingError.new("entry missing required fields #{missing_fields.map(&:to_s)}") unless missing_fields.empty? group = MetricGroup.new(entry[:group], entry[:priority]) group.tap { |g| g.metrics = metrics_from_list(entry[:metrics]) } end def additional_metrics_raw - @additional_metrics_raw ||= YAML.load_file(Rails.root.join('config/additional_metrics.yml'))&.map(&:deep_symbolize_keys).freeze + @additional_metrics_raw ||= load_yaml_file&.map(&:deep_symbolize_keys).freeze + end + + def load_yaml_file + YAML.load_file(Rails.root.join('config/additional_metrics.yml')) end end end diff --git a/lib/gitlab/prometheus/queries/query_additional_metrics.rb b/lib/gitlab/prometheus/queries/query_additional_metrics.rb index a5a401f84cd..e44be770544 100644 --- a/lib/gitlab/prometheus/queries/query_additional_metrics.rb +++ b/lib/gitlab/prometheus/queries/query_additional_metrics.rb @@ -37,18 +37,19 @@ module Gitlab def query_with_result(query) query[:result]&.any? do |item| - item&.[]('values')&.any? || item&.[]('value')&.any? + item&.[](:values)&.any? || item&.[](:value)&.any? end end def process_query(context, query) query_with_result = query.dup - query_with_result[:result] = + result = if query.key?(:query_range) client_query_range(query[:query_range] % context, start: context[:timeframe_start], stop: context[:timeframe_end]) else client_query(query[:query] % context, time: context[:timeframe_end]) end + query_with_result[:result] = result&.map(&:deep_symbolize_keys) query_with_result end diff --git a/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb b/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb new file mode 100644 index 00000000000..97280de173e --- /dev/null +++ b/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb @@ -0,0 +1,250 @@ +require 'spec_helper' + +describe Gitlab::Prometheus::AdditionalMetricsParser, lib: true do + include Prometheus::MetricBuilders + + let(:parser_error_class) { Gitlab::Prometheus::ParsingError } + + describe '#load_groups_from_yaml' do + subject { described_class.load_groups_from_yaml } + + describe 'parsing sample yaml' do + let(:sample_yaml) do + <<-EOF.strip_heredoc + - group: group_a + priority: 1 + metrics: + - title: "title" + required_metrics: [ metric_a, metric_b ] + weight: 1 + queries: [{ query_range: 'query_range_a', label: label, unit: unit }] + - title: "title" + required_metrics: [metric_a] + weight: 1 + queries: [{ query_range: 'query_range_empty' }] + - group: group_b + priority: 1 + metrics: + - title: title + required_metrics: [] + weight: 1 + queries: [{query_range: query_range_a}] + EOF + end + + before do + described_class.instance_variable_set :@additional_metrics_raw, nil + allow(described_class).to receive(:load_yaml_file) { YAML.load(sample_yaml) } + end + + it 'parses to two metric groups with 2 and 1 metric respectively' do + expect(subject.count).to eq(2) + expect(subject[0].metrics.count).to eq(2) + expect(subject[1].metrics.count).to eq(1) + end + + it 'provide group data' do + expect(subject[0]).to have_attributes(name: 'group_a', priority: 1) + expect(subject[1]).to have_attributes(name: 'group_b', priority: 1) + end + + it 'provides metrics data' do + metrics = subject.flat_map(&:metrics) + + expect(metrics.count).to eq(3) + expect(metrics[0]).to have_attributes(title: 'title', required_metrics: %w(metric_a metric_b), weight: 1) + expect(metrics[1]).to have_attributes(title: 'title', required_metrics: %w(metric_a), weight: 1) + expect(metrics[2]).to have_attributes(title: 'title', required_metrics: [], weight: 1) + end + + it 'provides query data' do + queries = subject.flat_map(&:metrics).flat_map(&:queries) + + expect(queries.count).to eq(3) + expect(queries[0]).to eq(query_range: 'query_range_a', label: 'label', unit: 'unit') + expect(queries[1]).to eq(query_range: 'query_range_empty') + expect(queries[2]).to eq(query_range: 'query_range_a') + end + end + + shared_examples 'required field' do |field_name| + before do + described_class.instance_variable_set :@additional_metrics_raw, nil + end + + context "when #{field_name} is nil" do + before do + allow(described_class).to receive(:load_yaml_file) { YAML.load(field_missing) } + end + + it 'throws parsing error' do + expect { subject }.to raise_error(parser_error_class, /missing.*#{field_name}/) + end + end + + context "when #{field_name} are not specified" do + before do + allow(described_class).to receive(:load_yaml_file) { YAML.load(field_nil) } + end + + it 'throws parsing error' do + expect { subject }.to raise_error(parser_error_class, /missing.*#{field_name}/) + end + end + end + + describe 'group required fields' do + it_behaves_like 'required field', :metrics do + let(:field_nil) do + <<-EOF.strip_heredoc + - group: group_a + priority: 1 + metrics: + EOF + end + + let(:field_missing) do + <<-EOF.strip_heredoc + - group: group_a + priority: 1 + EOF + end + end + + it_behaves_like 'required field', :group do + let(:field_nil) do + <<-EOF.strip_heredoc + - priority: 1 + metrics: [] + EOF + end + + let(:field_missing) do + <<-EOF.strip_heredoc + - priority: 1 + metrics: [] + EOF + end + end + + it_behaves_like 'required field', :priority do + let(:field_nil) do + <<-EOF.strip_heredoc + - group: group_a + priority: + metrics: [] + EOF + end + + let(:field_missing) do + <<-EOF.strip_heredoc + - group: group_a + metrics: [] + EOF + end + end + end + + describe 'metrics fields parsing' do + it_behaves_like 'required field', :title do + let(:field_nil) do + <<-EOF.strip_heredoc + - group: group_a + priority: 1 + metrics: + - title: + required_metrics: [] + weight: 1 + queries: [] + EOF + end + + let(:field_missing) do + <<-EOF.strip_heredoc + - group: group_a + priority: 1 + metrics: + - required_metrics: [] + weight: 1 + queries: [] + EOF + end + end + + it_behaves_like 'required field', :required_metrics do + let(:field_nil) do + <<-EOF.strip_heredoc + - group: group_a + priority: 1 + metrics: + - title: title + required_metrics: + weight: 1 + queries: [] + EOF + end + + let(:field_missing) do + <<-EOF.strip_heredoc + - group: group_a + priority: 1 + metrics: + - title: title + weight: 1 + queries: [] + EOF + end + end + + it_behaves_like 'required field', :weight do + let(:field_nil) do + <<-EOF.strip_heredoc + - group: group_a + priority: 1 + metrics: + - title: title + required_metrics: [] + weight: + queries: [] + EOF + end + + let(:field_missing) do + <<-EOF.strip_heredoc + - group: group_a + priority: 1 + metrics: + - title: title + required_metrics: [] + queries: [] + EOF + end + end + + it_behaves_like 'required field', :queries do + let(:field_nil) do + <<-EOF.strip_heredoc + - group: group_a + priority: 1 + metrics: + - title: title + required_metrics: [] + weight: 1 + queries: + EOF + end + + let(:field_missing) do + <<-EOF.strip_heredoc + - group: group_a + priority: 1 + metrics: + - title: title + required_metrics: [] + weight: 1 + EOF + end + end + end + end +end diff --git a/spec/support/prometheus/metric_builders.rb b/spec/support/prometheus/metric_builders.rb index 18378ec0145..e4b55c22acd 100644 --- a/spec/support/prometheus/metric_builders.rb +++ b/spec/support/prometheus/metric_builders.rb @@ -21,7 +21,7 @@ module Prometheus end def simple_metric_group(name: 'name', metrics: simple_metrics) - Gitlab::Prometheus::MetricGroup.new(name: name, priority: 1, metrics: metrics) + Gitlab::Prometheus::MetricGroup.new( name, 1, metrics) end end end From 625b1303dce45108606e3cc4491344950d7318bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Mon, 12 Jun 2017 09:55:50 +0800 Subject: [PATCH 0058/1380] optimize translation based on comments --- app/assets/javascripts/locale/zh_HK/app.js | 2 +- locale/zh_HK/gitlab.po | 699 +++------------------ locale/zh_HK/gitlab.po.time_stamp | 1 - 3 files changed, 81 insertions(+), 621 deletions(-) diff --git a/app/assets/javascripts/locale/zh_HK/app.js b/app/assets/javascripts/locale/zh_HK/app.js index 9d4cfeea810..fcd5795c8bb 100644 --- a/app/assets/javascripts/locale/zh_HK/app.js +++ b/app/assets/javascripts/locale/zh_HK/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-07 17:36+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-07 10:18-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"About auto deploy":["關於自動部署"],"Activity":["活動"],"Add Changelog":["添加變更日誌"],"Add Contribution guide":["添加貢獻指南"],"Add License":["添加許可證"],"Add an SSH key to your profile to pull or push via SSH.":["添加一個用於推送或拉取的 SSH 秘鑰到您的個人資料中。"],"Add new directory":["添加新目錄"],"Archived project! Repository is read-only":["歸檔項目!存儲庫是只讀的"],"Branch":["分支"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["分支 %{branch_name} 已創建。如要設置自動部署, 請選擇 GitLab CI Yaml 模板並提交更改。%{link_to_autodeploy_doc}"],"Branches":["分支"],"ByAuthor|by":["作者:"],"CI configuration":["CI 配置"],"Changelog":["變更日誌"],"Charts":["圖表"],"CiStatusLabel|canceled":["已取消"],"CiStatusLabel|created":["已創建"],"CiStatusLabel|failed":["已失敗"],"CiStatusLabel|manual action":["手動操作"],"CiStatusLabel|passed":["已通過"],"CiStatusLabel|passed with warnings":["已通過但有警告"],"CiStatusLabel|pending":["等待中"],"CiStatusLabel|skipped":["已跳過"],"CiStatusLabel|waiting for manual action":["等待手動操作"],"CiStatusText|blocked":["已阻塞"],"CiStatusText|canceled":["已取消"],"CiStatusText|created":["已創建"],"CiStatusText|failed":["已失敗"],"CiStatusText|manual":["待手動"],"CiStatusText|passed":["已通過"],"CiStatusText|pending":["等待中"],"CiStatusText|skipped":["已跳過"],"CiStatus|running":["運行中"],"Commit":["提交"],"CommitMessage|Add %{file_name}":["添加 %{file_name}"],"Commits":["提交"],"Commits|History":["歷史"],"Compare":["比較"],"Contribution guide":["貢獻指南"],"Contributors":["貢獻者"],"Copy URL to clipboard":["複製URL到剪貼板"],"Copy commit SHA to clipboard":["複製提交 SHA 到剪貼板"],"Create New Directory":["創建新目錄"],"Create directory":["創建目錄"],"Create empty bare repository":["創建空的存儲庫"],"Create merge request":["創建合併請求"],"CreateNewFork|Fork":["派生"],"Custom notification events":["自定義通知事件"],"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}.":["自定義通知級別與參與級別相同。使用自定義通知級別,您只能收到所選定事件通知。想瞭解更多信息,請查看 %{notification_link}."],"Cycle Analytics":["週期分析"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Deploy":["部署"],"Directory name":["目錄名稱"],"Don't show again":["不再顯示"],"Download tar":["下載 tar"],"Download tar.bz2":["下載 tar.bz2"],"Download tar.gz":["下載 tar.gz"],"Download zip":["下載 zip"],"DownloadArtifacts|Download":["下載"],"DownloadSource|Download":["下載"],"Files":["文件"],"Find by path":["按路徑查找"],"Find file":["查找文件"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"ForkedFromProjectPath|Forked from":["離開"],"Forks":["派生"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Go to your fork":["跳轉到您的派生項目"],"GoToYourFork|Fork":["跳轉到您的"],"Home":["主頁"],"Housekeeping successfully started":["已開始維護"],"Import repository":["導入存儲庫"],"Introducing Cycle Analytics":["週期分析簡介"],"LFSStatus|Disabled":["禁用"],"LFSStatus|Enabled":["啟用"],"Last %d day":["最後 %d 天"],"Last Update":["最後更新"],"Last commit":["最後提交"],"Leave group":["離開群組"],"Leave project":["離開項目"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"MissingSSHKeyWarningLink|add an SSH key":["添加一個 SSH 公鑰"],"New Issue":["新議題"],"New branch":["新分支"],"New directory":["新目錄"],"New file":["新文件"],"New issue":["新議題"],"New merge request":["新合併請求"],"New snippet":["新代碼片段"],"New tag":["新標籤"],"No repository":["沒有存儲庫"],"Not available":["不可用"],"Not enough data":["數據不足"],"Notification events":["通知事件"],"NotificationEvent|Close issue":["關閉議題"],"NotificationEvent|Close merge request":["關閉合併請求"],"NotificationEvent|Failed pipeline":["流水線失敗"],"NotificationEvent|Merge merge request":["合併請求被合併"],"NotificationEvent|New issue":["新議題"],"NotificationEvent|New merge request":["新合併請求"],"NotificationEvent|New note":["新評論"],"NotificationEvent|Reassign issue":["重新指派議題"],"NotificationEvent|Reassign merge request":["重新指派合併請求"],"NotificationEvent|Reopen issue":["重新打開議題"],"NotificationEvent|Successful pipeline":["流水線成功完成"],"NotificationLevel|Custom":["自定義"],"NotificationLevel|Disabled":["禁用"],"NotificationLevel|Global":["全局"],"NotificationLevel|On mention":["提及"],"NotificationLevel|Participate":["參與"],"NotificationLevel|Watch":["關注"],"OpenedNDaysAgo|Opened":["開始於"],"Pipeline Health":["流水線健康指標"],"Project '%{project_name}' queued for deletion.":["項目 '%{project_name}' 已進入刪除隊列。"],"Project '%{project_name}' was successfully created.":["項目 '%{project_name}' 已創建完成。"],"Project '%{project_name}' was successfully updated.":["項目 '%{project_name}' 已更新完成。"],"Project '%{project_name}' will be deleted.":["項目 '%{project_name}' 已刪除。"],"Project access must be granted explicitly to each user.":["訪問項目必須明確授權給每個用戶。"],"Project export could not be deleted.":["無法刪除項目導出。"],"Project export has been deleted.":["項目導出已刪除。"],"Project export link has expired. Please generate a new export from your project settings.":["項目導出鏈接已過期。請從您的項目設置中生成新的導出。"],"Project export started. A download link will be sent by email.":["項目導出已開始。下載鏈接將通過電子郵件發送。"],"Project home":["項目主頁"],"ProjectFeature|Disabled":["禁用"],"ProjectFeature|Everyone with access":["任何人都可訪問"],"ProjectFeature|Only team members":["只有團隊成員"],"ProjectFileTree|Name":["名稱"],"ProjectLastActivity|Never":["從未"],"ProjectLifecycle|Stage":["項目生命週期"],"ProjectNetworkGraph|Graph":["分支圖"],"Read more":["了解更多"],"Readme":["自述文件"],"RefSwitcher|Branches":["分支"],"RefSwitcher|Tags":["標籤"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合並請求"],"Remind later":["稍後提醒"],"Remove project":["刪除項目"],"Request Access":["申請訪問"],"Search branches and tags":["搜索分支和標籤"],"Select Archive Format":["選擇下載格式"],"Set a password on your account to pull or push via %{protocol}":["為您的賬戶添加壹個用於推送或拉取的 %{protocol} 密碼。"],"Set up CI":["設置 CI"],"Set up Koding":["設置 Koding"],"Set up auto deploy":["設置自動部署"],"SetPasswordToCloneLink|set a password":["設置密碼"],"Showing %d event":["顯示 %d 個事件"],"Source code":["源代碼"],"StarProject|Star":["星標"],"Switch branch/tag":["切換分支/標籤"],"Tag":["標籤"],"Tags":["標籤"],"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.":["編碼階段概述了從第一次提交到創建合併請求的時間。創建第壹個合並請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"The fork relationship has been removed.":["派生關係已被刪除。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建一個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"The project can be accessed by any logged in user.":["該項目允許已登錄的用戶訪問。"],"The project can be accessed without any authentication.":["該項目允許任何人訪問。"],"The repository for this project does not exist.":["此項目的存儲庫不存在。"],"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.":["評審階段概述了從創建合並請求到合併的時間。當創建第壹個合並請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合並請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是一個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"This means you can not push code until you create an empty repository or import existing one.":["在創建一個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合並或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Timeago|%s days ago":["%s 天前"],"Timeago|%s days remaining":["剩餘 %s 天"],"Timeago|%s hours remaining":["剩餘 %s 小時"],"Timeago|%s minutes ago":["%s 分鐘前"],"Timeago|%s minutes remaining":["剩餘 %s 分鐘"],"Timeago|%s months ago":["%s 個月前"],"Timeago|%s months remaining":["剩餘 %s 月"],"Timeago|%s seconds remaining":["剩餘 %s 秒"],"Timeago|%s weeks ago":["%s 星期前"],"Timeago|%s weeks remaining":["剩餘 %s 星期"],"Timeago|%s years ago":["%s 年前"],"Timeago|%s years remaining":["剩餘 %s 年"],"Timeago|1 day remaining":["剩餘 1 天"],"Timeago|1 hour remaining":["剩餘 1 小時"],"Timeago|1 minute remaining":["剩餘 1 分鐘"],"Timeago|1 month remaining":["剩餘 1 個月"],"Timeago|1 week remaining":["剩餘 1 星期"],"Timeago|1 year remaining":["剩餘 1 年"],"Timeago|Past due":["逾期"],"Timeago|a day ago":["1 天前"],"Timeago|a month ago":["1 個月前"],"Timeago|a week ago":["1 星期前"],"Timeago|a while":["剛剛"],"Timeago|a year ago":["1 年前"],"Timeago|about %s hours ago":["大約 %s 小時前"],"Timeago|about a minute ago":["大約 1 分鐘前"],"Timeago|about an hour ago":["大約 1 小時前"],"Timeago|in %s days":["在 %s 天"],"Timeago|in %s hours":["在 %s 小時"],"Timeago|in %s minutes":["在 %s 分鐘"],"Timeago|in %s months":["在 %s 個月"],"Timeago|in %s seconds":["在 %s 秒"],"Timeago|in %s weeks":["在 %s 星期"],"Timeago|in %s years":["在 %s 年"],"Timeago|in 1 day":["在 1 天"],"Timeago|in 1 hour":["在 1 小時"],"Timeago|in 1 minute":["在 1 分鐘"],"Timeago|in 1 month":["在 1 月"],"Timeago|in 1 week":["在 1 星期"],"Timeago|in 1 year":["在 1 年"],"Timeago|less than a minute ago":["不到 1 分鐘前"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Unstar":["取消"],"Upload New File":["上傳新文件"],"Upload file":["上傳文件"],"Use your global notification setting":["使用全局通知設置"],"VisibilityLevel|Internal":["內部"],"VisibilityLevel|Private":["私有"],"VisibilityLevel|Public":["公開"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"Withdraw Access Request":["取消訪問請求"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["您將要刪除 %{project_name_with_namespace}。\\n已刪除的項目無法恢復!\\n妳確定繼續嗎?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["將刪除與源項目 %{forked_from_project} 的派生關係。妳確定繼續嗎?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["將 %{project_name_with_namespace} 轉義給另一個所有者。妳確定繼續嗎?"],"You can only add files when you are on a branch":["您只能在分支上添加文件"],"You must sign in to star a project":["您必須登錄才能對項目加星標"],"You need permission.":["您需要相關的權限。"],"You will not get any notifications via email":["您將不會收到任何通知郵件"],"You will only receive notifications for the events you choose":["您只會收到您選擇的事件通知"],"You will only receive notifications for threads you have participated in":["您只會收到您參與的主題的通知"],"You will receive notifications for any activity":["您將不會收到任何通知"],"You will receive notifications only for comments in which you were @mentioned":["您只会收到評論中提及(@)您的通知"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["在您的賬戶上 %{set_password_link} 之前, 您將無法通過 %{protocol} 拉取或推送代碼。"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["在您的個人資料中添加 %{add_ssh_key_link} 之前, 您將無法通過 SSH 拉取或推送代碼。"],"Your name":["您的名字"],"committed":["提交"],"day":["天"],"notification emails":["通知郵件"]}}}; \ No newline at end of file +var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-07 21:22+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-09 01:09-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://www.transifex.com/gitlab-zh/teams/75177/zh_HK/)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"Are you sure you want to delete this pipeline schedule?":["您確定要刪除此流水線計劃嗎?"],"ByAuthor|by":["作者:"],"Cancel":["取消"],"Commit":["提交"],"Cron Timezone":["Cron 時區"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Delete":["刪除"],"Deploy":["部署"],"Description":["描述"],"Edit":["編輯"],"Edit Pipeline Schedule %{id}":["編輯 %{id} 流水線計劃"],"Failed to change the owner":["無法變更所有者"],"Failed to remove the pipeline schedule":["無法刪除流水線計劃"],"Filter":["過濾"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Interval Pattern":["間隔模式"],"Introducing Cycle Analytics":["週期分析簡介"],"Last %d day":["最後 %d 天"],"Last Pipeline":["最新流水線"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"New Issue":["新議題"],"New Pipeline Schedule":["創建流水線計劃"],"No schedules":["沒有計劃"],"Not available":["不可用"],"Not enough data":["數據不足"],"OpenedNDaysAgo|Opened":["開始於"],"Owner":["所有者"],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":["流水線計劃"],"Pipeline Schedules":["流水線計劃"],"PipelineSchedules|Activated":["已激活"],"PipelineSchedules|Active":["激活"],"PipelineSchedules|All":["所有"],"PipelineSchedules|Inactive":["等待"],"PipelineSchedules|Next Run":["下壹個運行"],"PipelineSchedules|None":["無"],"PipelineSchedules|Provide a short description for this pipeline":["為此流水線提供簡短描述"],"PipelineSchedules|Take ownership":["取得所有權"],"PipelineSchedules|Target":["目標"],"ProjectLifecycle|Stage":["階段"],"Read more":["了解更多"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合併請求"],"Save pipeline schedule":["保存流水線計劃"],"Schedule a new pipeline":["新增流水線計劃"],"Select a timezone":["選擇時區"],"Select target branch":["選擇目標分支"],"Showing %d event":["顯示 %d 個事件"],"Target Branch":["目標分支"],"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.":["編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建壹個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"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.":["評審階段概述了從創建合併請求到合併的時間。當創建第壹個合併請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合併或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"You need permission.":["您需要相關的權限。"],"day":["天"]}}}; \ No newline at end of file diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po index 4d8ceac381e..4b02ba19305 100644 --- a/locale/zh_HK/gitlab.po +++ b/locale/zh_HK/gitlab.po @@ -1,179 +1,39 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gitlab package. +# FIRST AUTHOR , YEAR. # Huang Tao , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-07 17:36+0200\n" +"POT-Creation-Date: 2017-06-07 21:22+0200\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-07 10:18-0400\n" +"PO-Revision-Date: 2017-06-09 01:09-0400\n" "Last-Translator: Huang Tao \n" -"Language-Team: Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)\n" +"Language-Team: Chinese (Hong Kong) (https://www.transifex.com/gitlab-zh/" +"teams/75177/zh_HK/)\n" "Language: zh-HK\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Zanata 3.9.6\n" -msgid "About auto deploy" -msgstr "關於自動部署" - -msgid "Activity" -msgstr "活動" - -msgid "Add Changelog" -msgstr "添加變更日誌" - -msgid "Add Contribution guide" -msgstr "添加貢獻指南" - -msgid "Add License" -msgstr "添加許可證" - -msgid "Add an SSH key to your profile to pull or push via SSH." -msgstr "添加一個用於推送或拉取的 SSH 秘鑰到您的個人資料中。" - -msgid "Add new directory" -msgstr "添加新目錄" - -msgid "Archived project! Repository is read-only" -msgstr "歸檔項目!存儲庫是只讀的" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "分支" - -msgid "" -"Branch %{branch_name} was created. To set up auto deploy, " -"choose a GitLab CI Yaml template and commit your changes. " -"%{link_to_autodeploy_doc}" -msgstr "" -"分支 %{branch_name} 已創建。如要設置自動部署, 請選擇 GitLab CI Yaml " -"模板並提交更改。%{link_to_autodeploy_doc}" - -msgid "Branches" -msgstr "分支" +msgid "Are you sure you want to delete this pipeline schedule?" +msgstr "您確定要刪除此流水線計劃嗎?" msgid "ByAuthor|by" msgstr "作者:" -msgid "CI configuration" -msgstr "CI 配置" - -msgid "Changelog" -msgstr "變更日誌" - -msgid "Charts" -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 "Cancel" +msgstr "取消" msgid "Commit" msgid_plural "Commits" msgstr[0] "提交" -msgid "CommitMessage|Add %{file_name}" -msgstr "添加 %{file_name}" - -msgid "Commits" -msgstr "提交" - -msgid "Commits|History" -msgstr "歷史" - -msgid "Compare" -msgstr "比較" - -msgid "Contribution guide" -msgstr "貢獻指南" - -msgid "Contributors" -msgstr "貢獻者" - -msgid "Copy URL to clipboard" -msgstr "複製URL到剪貼板" - -msgid "Copy commit SHA to clipboard" -msgstr "複製提交 SHA 到剪貼板" - -msgid "Create New Directory" -msgstr "創建新目錄" - -msgid "Create directory" -msgstr "創建目錄" - -msgid "Create empty bare repository" -msgstr "創建空的存儲庫" - -msgid "Create merge request" -msgstr "創建合併請求" - -msgid "CreateNewFork|Fork" -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 "" -"自定義通知級別與參與級別相同。使用自定義通知級別,您只能收到所選定事件通知。想瞭解更多信息,請查看 %{notification_link}." - -msgid "Cycle Analytics" -msgstr "週期分析" +msgid "Cron Timezone" +msgstr "Cron 時區" msgid "" "Cycle Analytics gives an overview of how much time it takes to go from idea " @@ -201,42 +61,30 @@ msgstr "預發布" msgid "CycleAnalyticsStage|Test" msgstr "測試" +msgid "Delete" +msgstr "刪除" + msgid "Deploy" msgid_plural "Deploys" msgstr[0] "部署" -msgid "Directory name" -msgstr "目錄名稱" +msgid "Description" +msgstr "描述" -msgid "Don't show again" -msgstr "不再顯示" +msgid "Edit" +msgstr "編輯" -msgid "Download tar" -msgstr "下載 tar" +msgid "Edit Pipeline Schedule %{id}" +msgstr "編輯 %{id} 流水線計劃" -msgid "Download tar.bz2" -msgstr "下載 tar.bz2" +msgid "Failed to change the owner" +msgstr "無法變更所有者" -msgid "Download tar.gz" -msgstr "下載 tar.gz" +msgid "Failed to remove the pipeline schedule" +msgstr "無法刪除流水線計劃" -msgid "Download zip" -msgstr "下載 zip" - -msgid "DownloadArtifacts|Download" -msgstr "下載" - -msgid "DownloadSource|Download" -msgstr "下載" - -msgid "Files" -msgstr "文件" - -msgid "Find by path" -msgstr "按路徑查找" - -msgid "Find file" -msgstr "查找文件" +msgid "Filter" +msgstr "過濾" msgid "FirstPushedBy|First" msgstr "首次推送" @@ -244,57 +92,24 @@ msgstr "首次推送" msgid "FirstPushedBy|pushed by" msgstr "推送者:" -msgid "ForkedFromProjectPath|Forked from" -msgstr "離開" - -msgid "Forks" -msgstr "派生" - msgid "From issue creation until deploy to production" msgstr "從創建議題到部署到生產環境" msgid "From merge request merge until deploy to production" msgstr "從合併請求的合併到部署至生產環境" -msgid "Go to your fork" -msgstr "跳轉到您的派生項目" - -msgid "GoToYourFork|Fork" -msgstr "跳轉到您的" - -msgid "Home" -msgstr "主頁" - -msgid "Housekeeping successfully started" -msgstr "已開始維護" - -msgid "Import repository" -msgstr "導入存儲庫" +msgid "Interval Pattern" +msgstr "間隔模式" msgid "Introducing Cycle Analytics" msgstr "週期分析簡介" -msgid "LFSStatus|Disabled" -msgstr "禁用" - -msgid "LFSStatus|Enabled" -msgstr "啟用" - msgid "Last %d day" msgid_plural "Last %d days" msgstr[0] "最後 %d 天" -msgid "Last Update" -msgstr "最後更新" - -msgid "Last commit" -msgstr "最後提交" - -msgid "Leave group" -msgstr "離開群組" - -msgid "Leave project" -msgstr "離開項目" +msgid "Last Pipeline" +msgstr "最新流水線" msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" @@ -303,36 +118,15 @@ msgstr[0] "最多顯示 %d 個事件" msgid "Median" msgstr "中位數" -msgid "MissingSSHKeyWarningLink|add an SSH key" -msgstr "添加一個 SSH 公鑰" - msgid "New Issue" msgid_plural "New Issues" msgstr[0] "新議題" -msgid "New branch" -msgstr "新分支" +msgid "New Pipeline Schedule" +msgstr "創建流水線計劃" -msgid "New directory" -msgstr "新目錄" - -msgid "New file" -msgstr "新文件" - -msgid "New issue" -msgstr "新議題" - -msgid "New merge request" -msgstr "新合併請求" - -msgid "New snippet" -msgstr "新代碼片段" - -msgid "New tag" -msgstr "新標籤" - -msgid "No repository" -msgstr "沒有存儲庫" +msgid "No schedules" +msgstr "沒有計劃" msgid "Not available" msgstr "不可用" @@ -340,131 +134,54 @@ 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 "OpenedNDaysAgo|Opened" msgstr "開始於" +msgid "Owner" +msgstr "所有者" + msgid "Pipeline Health" msgstr "流水線健康指標" -msgid "Project '%{project_name}' queued for deletion." -msgstr "項目 '%{project_name}' 已進入刪除隊列。" +msgid "Pipeline Schedule" +msgstr "流水線計劃" -msgid "Project '%{project_name}' was successfully created." -msgstr "項目 '%{project_name}' 已創建完成。" +msgid "Pipeline Schedules" +msgstr "流水線計劃" -msgid "Project '%{project_name}' was successfully updated." -msgstr "項目 '%{project_name}' 已更新完成。" +msgid "PipelineSchedules|Activated" +msgstr "已激活" -msgid "Project '%{project_name}' will be deleted." -msgstr "項目 '%{project_name}' 已刪除。" +msgid "PipelineSchedules|Active" +msgstr "激活" -msgid "Project access must be granted explicitly to each user." -msgstr "訪問項目必須明確授權給每個用戶。" +msgid "PipelineSchedules|All" +msgstr "所有" -msgid "Project export could not be deleted." -msgstr "無法刪除項目導出。" +msgid "PipelineSchedules|Inactive" +msgstr "等待" -msgid "Project export has been deleted." -msgstr "項目導出已刪除。" +msgid "PipelineSchedules|Next Run" +msgstr "下壹個運行" -msgid "" -"Project export link has expired. Please generate a new export from your " -"project settings." -msgstr "項目導出鏈接已過期。請從您的項目設置中生成新的導出。" +msgid "PipelineSchedules|None" +msgstr "無" -msgid "Project export started. A download link will be sent by email." -msgstr "項目導出已開始。下載鏈接將通過電子郵件發送。" +msgid "PipelineSchedules|Provide a short description for this pipeline" +msgstr "為此流水線提供簡短描述" -msgid "Project home" -msgstr "項目主頁" +msgid "PipelineSchedules|Take ownership" +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 "PipelineSchedules|Target" +msgstr "目標" msgid "ProjectLifecycle|Stage" -msgstr "項目生命週期" - -msgid "ProjectNetworkGraph|Graph" -msgstr "分支圖" +msgstr "階段" msgid "Read more" msgstr "了解更多" -msgid "Readme" -msgstr "自述文件" - -msgid "RefSwitcher|Branches" -msgstr "分支" - -msgid "RefSwitcher|Tags" -msgstr "標籤" - msgid "Related Commits" msgstr "相關的提交" @@ -481,75 +198,41 @@ msgid "Related Merge Requests" msgstr "相關的合併請求" msgid "Related Merged Requests" -msgstr "相關已合併的合並請求" +msgstr "相關已合併的合併請求" -msgid "Remind later" -msgstr "稍後提醒" +msgid "Save pipeline schedule" +msgstr "保存流水線計劃" -msgid "Remove project" -msgstr "刪除項目" +msgid "Schedule a new pipeline" +msgstr "新增流水線計劃" -msgid "Request Access" -msgstr "申請訪問" +msgid "Select a timezone" +msgstr "選擇時區" -msgid "Search branches and tags" -msgstr "搜索分支和標籤" - -msgid "Select Archive Format" -msgstr "選擇下載格式" - -msgid "Set a password on your account to pull or push via %{protocol}" -msgstr "為您的賬戶添加壹個用於推送或拉取的 %{protocol} 密碼。" - -msgid "Set up CI" -msgstr "設置 CI" - -msgid "Set up Koding" -msgstr "設置 Koding" - -msgid "Set up auto deploy" -msgstr "設置自動部署" - -msgid "SetPasswordToCloneLink|set a password" -msgstr "設置密碼" +msgid "Select target branch" +msgstr "選擇目標分支" msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "顯示 %d 個事件" -msgid "Source code" -msgstr "源代碼" - -msgid "StarProject|Star" -msgstr "星標" - -msgid "Switch branch/tag" -msgstr "切換分支/標籤" - -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "標籤" - -msgid "Tags" -msgstr "標籤" +msgid "Target Branch" +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 "編碼階段概述了從第一次提交到創建合併請求的時間。創建第壹個合並請求後,數據將自動添加到此處。" +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 "議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建一個議題後,數據將自動添加到此處。" +msgstr "議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建壹個議題後,數據將自動添加到此處。" msgid "The phase of the development lifecycle." msgstr "項目生命週期中的各個階段。" @@ -566,26 +249,17 @@ msgid "" "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 "評審階段概述了從創建合並請求到合併的時間。當創建第壹個合並請求後,數據將自動添加到此處。" +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 "預發布階段概述了合並請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。" +msgstr "預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。" msgid "" "The testing stage shows the time GitLab CI takes to run every pipeline for " @@ -600,12 +274,7 @@ 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 "中位數是一個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。" - -msgid "" -"This means you can not push code until you create an empty repository or " -"import existing one." -msgstr "在創建一個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。" +msgstr "中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。" msgid "Time before an issue gets scheduled" msgstr "議題被列入日程表的時間" @@ -614,134 +283,11 @@ msgid "Time before an issue starts implementation" msgstr "開始進行編碼前的時間" msgid "Time between merge request creation and merge/close" -msgstr "從創建合併請求到被合並或關閉的時間" +msgstr "從創建合併請求到被合併或關閉的時間" msgid "Time until first merge request" msgstr "創建第壹個合併請求之前的時間" -msgid "Timeago|%s days ago" -msgstr "%s 天前" - -msgid "Timeago|%s days remaining" -msgstr "剩餘 %s 天" - -msgid "Timeago|%s hours remaining" -msgstr "剩餘 %s 小時" - -msgid "Timeago|%s minutes ago" -msgstr "%s 分鐘前" - -msgid "Timeago|%s minutes remaining" -msgstr "剩餘 %s 分鐘" - -msgid "Timeago|%s months ago" -msgstr "%s 個月前" - -msgid "Timeago|%s months remaining" -msgstr "剩餘 %s 月" - -msgid "Timeago|%s seconds remaining" -msgstr "剩餘 %s 秒" - -msgid "Timeago|%s weeks ago" -msgstr "%s 星期前" - -msgid "Timeago|%s weeks remaining" -msgstr "剩餘 %s 星期" - -msgid "Timeago|%s years ago" -msgstr "%s 年前" - -msgid "Timeago|%s years remaining" -msgstr "剩餘 %s 年" - -msgid "Timeago|1 day remaining" -msgstr "剩餘 1 天" - -msgid "Timeago|1 hour remaining" -msgstr "剩餘 1 小時" - -msgid "Timeago|1 minute remaining" -msgstr "剩餘 1 分鐘" - -msgid "Timeago|1 month remaining" -msgstr "剩餘 1 個月" - -msgid "Timeago|1 week remaining" -msgstr "剩餘 1 星期" - -msgid "Timeago|1 year remaining" -msgstr "剩餘 1 年" - -msgid "Timeago|Past due" -msgstr "逾期" - -msgid "Timeago|a day ago" -msgstr "1 天前" - -msgid "Timeago|a month ago" -msgstr "1 個月前" - -msgid "Timeago|a week ago" -msgstr "1 星期前" - -msgid "Timeago|a while" -msgstr "剛剛" - -msgid "Timeago|a year ago" -msgstr "1 年前" - -msgid "Timeago|about %s hours ago" -msgstr "大約 %s 小時前" - -msgid "Timeago|about a minute ago" -msgstr "大約 1 分鐘前" - -msgid "Timeago|about an hour ago" -msgstr "大約 1 小時前" - -msgid "Timeago|in %s days" -msgstr "在 %s 天" - -msgid "Timeago|in %s hours" -msgstr "在 %s 小時" - -msgid "Timeago|in %s minutes" -msgstr "在 %s 分鐘" - -msgid "Timeago|in %s months" -msgstr "在 %s 個月" - -msgid "Timeago|in %s seconds" -msgstr "在 %s 秒" - -msgid "Timeago|in %s weeks" -msgstr "在 %s 星期" - -msgid "Timeago|in %s years" -msgstr "在 %s 年" - -msgid "Timeago|in 1 day" -msgstr "在 1 天" - -msgid "Timeago|in 1 hour" -msgstr "在 1 小時" - -msgid "Timeago|in 1 minute" -msgstr "在 1 分鐘" - -msgid "Timeago|in 1 month" -msgstr "在 1 月" - -msgid "Timeago|in 1 week" -msgstr "在 1 星期" - -msgid "Timeago|in 1 year" -msgstr "在 1 年" - -msgid "Timeago|less than a minute ago" -msgstr "不到 1 分鐘前" - msgid "Time|hr" msgid_plural "Time|hrs" msgstr[0] "小時" @@ -759,101 +305,16 @@ msgstr "總時間" msgid "Total test time for all commits/merges" msgstr "所有提交和合併的總測試時間" -msgid "Unstar" -msgstr "取消" - -msgid "Upload New File" -msgstr "上傳新文件" - -msgid "Upload file" -msgstr "上傳文件" - -msgid "Use your global notification setting" -msgstr "使用全局通知設置" - -msgid "VisibilityLevel|Internal" -msgstr "內部" - -msgid "VisibilityLevel|Private" -msgstr "私有" - -msgid "VisibilityLevel|Public" -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 "Withdraw Access Request" -msgstr "取消訪問請求" - -msgid "" -"You are going to remove %{project_name_with_namespace}.\n" -"Removed project CANNOT be restored!\n" -"Are you ABSOLUTELY sure?" -msgstr "您將要刪除 %{project_name_with_namespace}。\n" -"已刪除的項目無法恢復!\n" -"妳確定繼續嗎?" - -msgid "" -"You are going to remove the fork relationship to source project " -"%{forked_from_project}. Are you ABSOLUTELY sure?" -msgstr "將刪除與源項目 %{forked_from_project} 的派生關係。妳確定繼續嗎?" - -msgid "" -"You are going to transfer %{project_name_with_namespace} to another owner. " -"Are you ABSOLUTELY sure?" -msgstr "將 %{project_name_with_namespace} 轉義給另一個所有者。妳確定繼續嗎?" - -msgid "You can only add files when you are on a branch" -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 "在您的賬戶上 %{set_password_link} 之前, 您將無法通過 %{protocol} 拉取或推送代碼。" - -msgid "" -"You won't be able to pull or push project code via SSH until you " -"%{add_ssh_key_link} to your profile" -msgstr "在您的個人資料中添加 %{add_ssh_key_link} 之前, 您將無法通過 SSH 拉取或推送代碼。" - -msgid "Your name" -msgstr "您的名字" - -msgid "committed" -msgstr "提交" - msgid "day" msgid_plural "days" msgstr[0] "天" -msgid "notification emails" -msgstr "通知郵件" - diff --git a/locale/zh_HK/gitlab.po.time_stamp b/locale/zh_HK/gitlab.po.time_stamp index 0519ecba6ea..e69de29bb2d 100644 --- a/locale/zh_HK/gitlab.po.time_stamp +++ b/locale/zh_HK/gitlab.po.time_stamp @@ -1 +0,0 @@ - \ No newline at end of file From 7f0221a44e2a2a34bc48a9194b969655874dcaf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Mon, 12 Jun 2017 13:22:33 +0800 Subject: [PATCH 0059/1380] supplement bulgarian translation Fix #33561 --- app/assets/javascripts/locale/bg/app.js | 2 +- locale/bg/gitlab.po | 103 ++++++++++++++++++++++-- locale/bg/gitlab.po.time_stamp | 1 + 3 files changed, 100 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/locale/bg/app.js b/app/assets/javascripts/locale/bg/app.js index ba56c0bea25..f1fedb546de 100644 --- a/app/assets/javascripts/locale/bg/app.js +++ b/app/assets/javascripts/locale/bg/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-05-04 19:24-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-05 09:40-0400","Last-Translator":"Lyubomir Vasilev ","Language-Team":"Bulgarian","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"ByAuthor|by":["от"],"Commit":["Подаване","Подавания"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Deploy":["Внедряване","Внедрявания"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Introducing Cycle Analytics":["Представяме Ви анализът на циклите"],"Last %d day":["Последния %d ден","Последните %d дни"],"Limited to showing %d event at most":["Ограничено до показване на последното %d събитие","Ограничено до показване на последните %d събития"],"Median":["Медиана"],"New Issue":["Нов проблем","Нови проблема"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"OpenedNDaysAgo|Opened":["Отворен"],"Pipeline Health":["Състояние"],"ProjectLifecycle|Stage":["Етап"],"Read more":["Прочетете повече"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани задачи за внедряване"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"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.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"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.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"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.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия."],"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.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"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.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"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.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всички задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнените на първата Ви такава задача."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"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.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"You need permission.":["Нуждаете се от разрешение."],"day":["ден","дни"]}}}; \ No newline at end of file +var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-07 21:22+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-10 03:35-0400","Last-Translator":"Lyubomir Vasilev ","Language-Team":"Bulgarian","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"Are you sure you want to delete this pipeline schedule?":["Наистина ли искате да изтриете този план за схема?"],"ByAuthor|by":["от"],"Cancel":["Отказ"],"Commit":["Подаване","Подавания"],"Cron Timezone":["Часова зона за „Cron“"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Delete":["Изтриване"],"Deploy":["Внедряване","Внедрявания"],"Description":["Описание"],"Edit":["Редактиране"],"Edit Pipeline Schedule %{id}":["Редактиране на плана %{id} за схема"],"Failed to change the owner":["Собственикът не може да бъде променен"],"Failed to remove the pipeline schedule":["Планът за схема не може да бъде премахнат"],"Filter":["Филтриране"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Interval Pattern":["Шаблон за интервала"],"Introducing Cycle Analytics":["Представяме Ви анализа на циклите"],"Last %d day":["Последния %d ден","Последните %d дни"],"Last Pipeline":["Последна схема"],"Limited to showing %d event at most":["Ограничено до показване на последното %d събитие","Ограничено до показване на последните %d събития"],"Median":["Медиана"],"New Issue":["Нов проблем","Нови проблема"],"New Pipeline Schedule":["Нов план за схема"],"No schedules":["Няма планове"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"OpenedNDaysAgo|Opened":["Отворен"],"Owner":["Собственик"],"Pipeline Health":["Състояние"],"Pipeline Schedule":["План за схема"],"Pipeline Schedules":["Планове за схема"],"PipelineSchedules|Activated":["Включено"],"PipelineSchedules|Active":["Активно"],"PipelineSchedules|All":["Всички"],"PipelineSchedules|Inactive":["Неактивно"],"PipelineSchedules|Next Run":["Следващо изпълнение"],"PipelineSchedules|None":["Нищо"],"PipelineSchedules|Provide a short description for this pipeline":["Въведете кратко описание за тази схема"],"PipelineSchedules|Take ownership":["Поемане на собствеността"],"PipelineSchedules|Target":["Цел"],"ProjectLifecycle|Stage":["Етап"],"Read more":["Прочетете повече"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани задачи за внедряване"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Save pipeline schedule":["Запазване на плана за схема"],"Schedule a new pipeline":["Създаване на нов план за схема"],"Select a timezone":["Изберете часова зона"],"Select target branch":["Изберете целеви клон"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"Target Branch":["Целеви клон"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"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.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"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.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"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.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия."],"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.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"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.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"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.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнението на първата Ви схема."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"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.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"You need permission.":["Нуждаете се от разрешение."],"day":["ден","дни"]}}}; \ No newline at end of file diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po index e6caf83252d..41805a7792e 100644 --- a/locale/bg/gitlab.po +++ b/locale/bg/gitlab.po @@ -3,25 +3,34 @@ msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-05-04 19:24-0500\n" +"POT-Creation-Date: 2017-06-07 21:22+0200\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-05 09:40-0400\n" +"PO-Revision-Date: 2017-06-10 03:35-0400\n" "Last-Translator: Lyubomir Vasilev \n" "Language-Team: Bulgarian\n" "Language: bg\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +msgid "Are you sure you want to delete this pipeline schedule?" +msgstr "Наистина ли искате да изтриете този план за схема?" + msgid "ByAuthor|by" msgstr "от" +msgid "Cancel" +msgstr "Отказ" + msgid "Commit" msgid_plural "Commits" msgstr[0] "Подаване" msgstr[1] "Подавания" +msgid "Cron Timezone" +msgstr "Часова зона за „Cron“" + msgid "" "Cycle Analytics gives an overview of how much time it takes to go from idea " "to production in your project." @@ -50,11 +59,32 @@ msgstr "Подготовка за издаване" msgid "CycleAnalyticsStage|Test" msgstr "Тестване" +msgid "Delete" +msgstr "Изтриване" + msgid "Deploy" msgid_plural "Deploys" msgstr[0] "Внедряване" msgstr[1] "Внедрявания" +msgid "Description" +msgstr "Описание" + +msgid "Edit" +msgstr "Редактиране" + +msgid "Edit Pipeline Schedule %{id}" +msgstr "Редактиране на плана %{id} за схема" + +msgid "Failed to change the owner" +msgstr "Собственикът не може да бъде променен" + +msgid "Failed to remove the pipeline schedule" +msgstr "Планът за схема не може да бъде премахнат" + +msgid "Filter" +msgstr "Филтриране" + msgid "FirstPushedBy|First" msgstr "Първо" @@ -68,14 +98,20 @@ msgid "From merge request merge until deploy to production" msgstr "" "От прилагането на заявката за сливане до внедряването в крайната версия" +msgid "Interval Pattern" +msgstr "Шаблон за интервала" + msgid "Introducing Cycle Analytics" -msgstr "Представяме Ви анализът на циклите" +msgstr "Представяме Ви анализа на циклите" msgid "Last %d day" msgid_plural "Last %d days" msgstr[0] "Последния %d ден" msgstr[1] "Последните %d дни" +msgid "Last Pipeline" +msgstr "Последна схема" + msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" msgstr[0] "Ограничено до показване на последното %d събитие" @@ -89,6 +125,12 @@ msgid_plural "New Issues" msgstr[0] "Нов проблем" msgstr[1] "Нови проблема" +msgid "New Pipeline Schedule" +msgstr "Нов план за схема" + +msgid "No schedules" +msgstr "Няма планове" + msgid "Not available" msgstr "Не е налично" @@ -98,9 +140,45 @@ msgstr "Няма достатъчно данни" msgid "OpenedNDaysAgo|Opened" msgstr "Отворен" +msgid "Owner" +msgstr "Собственик" + msgid "Pipeline Health" msgstr "Състояние" +msgid "Pipeline Schedule" +msgstr "План за схема" + +msgid "Pipeline Schedules" +msgstr "Планове за схема" + +msgid "PipelineSchedules|Activated" +msgstr "Включено" + +msgid "PipelineSchedules|Active" +msgstr "Активно" + +msgid "PipelineSchedules|All" +msgstr "Всички" + +msgid "PipelineSchedules|Inactive" +msgstr "Неактивно" + +msgid "PipelineSchedules|Next Run" +msgstr "Следващо изпълнение" + +msgid "PipelineSchedules|None" +msgstr "Нищо" + +msgid "PipelineSchedules|Provide a short description for this pipeline" +msgstr "Въведете кратко описание за тази схема" + +msgid "PipelineSchedules|Take ownership" +msgstr "Поемане на собствеността" + +msgid "PipelineSchedules|Target" +msgstr "Цел" + msgid "ProjectLifecycle|Stage" msgstr "Етап" @@ -125,11 +203,26 @@ msgstr "Свързани заявки за сливане" msgid "Related Merged Requests" msgstr "Свързани приложени заявки за сливане" +msgid "Save pipeline schedule" +msgstr "Запазване на плана за схема" + +msgid "Schedule a new pipeline" +msgstr "Създаване на нов план за схема" + +msgid "Select a timezone" +msgstr "Изберете часова зона" + +msgid "Select target branch" +msgstr "Изберете целеви клон" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "Показване на %d събитие" msgstr[1] "Показване на %d събития" +msgid "Target Branch" +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 " @@ -197,8 +290,8 @@ msgid "" "first pipeline finishes running." msgstr "" "Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни " -"всички задачи за свързаната заявка за сливане. Данните ще бъдат добавени " -"автоматично след като приключи изпълнените на първата Ви такава задача." +"всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат " +"добавени автоматично след като приключи изпълнението на първата Ви схема." msgid "The time taken by each data entry gathered by that stage." msgstr "Времето, което отнема всеки запис от данни за съответния етап." diff --git a/locale/bg/gitlab.po.time_stamp b/locale/bg/gitlab.po.time_stamp index e69de29bb2d..0519ecba6ea 100644 --- a/locale/bg/gitlab.po.time_stamp +++ b/locale/bg/gitlab.po.time_stamp @@ -0,0 +1 @@ + \ No newline at end of file From 6df36fc2adfc6dbdb16ab20c7bd2a30ae27801d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Mon, 12 Jun 2017 13:29:11 +0800 Subject: [PATCH 0060/1380] add changelog of supplement bulgarian translation --- .../33561-supplement_bulgarian_translation_of_i18n.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/33561-supplement_bulgarian_translation_of_i18n.yml diff --git a/changelogs/unreleased/33561-supplement_bulgarian_translation_of_i18n.yml b/changelogs/unreleased/33561-supplement_bulgarian_translation_of_i18n.yml new file mode 100644 index 00000000000..4f2ba2e1de3 --- /dev/null +++ b/changelogs/unreleased/33561-supplement_bulgarian_translation_of_i18n.yml @@ -0,0 +1,4 @@ +--- +title: Supplement Bulgarian translation of Project Page & Repository Page +merge_request: 12083 +author: Lyubomir Vasilev From 28e5b7db62146c82f6ba4da9fca7ee0596ecedfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 13 Jun 2017 11:22:51 +0800 Subject: [PATCH 0061/1380] Optimization 'bg' translation 1. Fix missing translations --- app/assets/javascripts/locale/bg/app.js | 2 +- locale/bg/gitlab.po | 794 +++++++++++++++++++++++- 2 files changed, 786 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/locale/bg/app.js b/app/assets/javascripts/locale/bg/app.js index f1fedb546de..33a5c3c7eb9 100644 --- a/app/assets/javascripts/locale/bg/app.js +++ b/app/assets/javascripts/locale/bg/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-07 21:22+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-10 03:35-0400","Last-Translator":"Lyubomir Vasilev ","Language-Team":"Bulgarian","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"Are you sure you want to delete this pipeline schedule?":["Наистина ли искате да изтриете този план за схема?"],"ByAuthor|by":["от"],"Cancel":["Отказ"],"Commit":["Подаване","Подавания"],"Cron Timezone":["Часова зона за „Cron“"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Delete":["Изтриване"],"Deploy":["Внедряване","Внедрявания"],"Description":["Описание"],"Edit":["Редактиране"],"Edit Pipeline Schedule %{id}":["Редактиране на плана %{id} за схема"],"Failed to change the owner":["Собственикът не може да бъде променен"],"Failed to remove the pipeline schedule":["Планът за схема не може да бъде премахнат"],"Filter":["Филтриране"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Interval Pattern":["Шаблон за интервала"],"Introducing Cycle Analytics":["Представяме Ви анализа на циклите"],"Last %d day":["Последния %d ден","Последните %d дни"],"Last Pipeline":["Последна схема"],"Limited to showing %d event at most":["Ограничено до показване на последното %d събитие","Ограничено до показване на последните %d събития"],"Median":["Медиана"],"New Issue":["Нов проблем","Нови проблема"],"New Pipeline Schedule":["Нов план за схема"],"No schedules":["Няма планове"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"OpenedNDaysAgo|Opened":["Отворен"],"Owner":["Собственик"],"Pipeline Health":["Състояние"],"Pipeline Schedule":["План за схема"],"Pipeline Schedules":["Планове за схема"],"PipelineSchedules|Activated":["Включено"],"PipelineSchedules|Active":["Активно"],"PipelineSchedules|All":["Всички"],"PipelineSchedules|Inactive":["Неактивно"],"PipelineSchedules|Next Run":["Следващо изпълнение"],"PipelineSchedules|None":["Нищо"],"PipelineSchedules|Provide a short description for this pipeline":["Въведете кратко описание за тази схема"],"PipelineSchedules|Take ownership":["Поемане на собствеността"],"PipelineSchedules|Target":["Цел"],"ProjectLifecycle|Stage":["Етап"],"Read more":["Прочетете повече"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани задачи за внедряване"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Save pipeline schedule":["Запазване на плана за схема"],"Schedule a new pipeline":["Създаване на нов план за схема"],"Select a timezone":["Изберете часова зона"],"Select target branch":["Изберете целеви клон"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"Target Branch":["Целеви клон"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"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.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"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.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"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.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия."],"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.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"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.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"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.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнението на първата Ви схема."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"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.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"You need permission.":["Нуждаете се от разрешение."],"day":["ден","дни"]}}}; \ No newline at end of file +var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-12 09:36-0400","Last-Translator":"Lyubomir Vasilev ","Language-Team":"Bulgarian (https://translate.zanata.org/project/view/GitLab)","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"%{commit_author_link} committed %{commit_timeago}":[""],"About auto deploy":["Относно автоматичното внедряване"],"Active":[""],"Activity":["Дейност"],"Add Changelog":["Добавяне на списък с промени"],"Add Contribution guide":["Добавяне на ръководство за сътрудничество"],"Add License":["Добавяне на лиценз"],"Add an SSH key to your profile to pull or push via SSH.":["Добавете SSH ключ в профила си, за да можете да изтегляте или изпращате промени чрез SSH."],"Add new directory":["Добавяне на нова папка"],"Archived project! Repository is read-only":["Архивиран проект! Хранилището е само за четене"],"Are you sure you want to delete this pipeline schedule?":["Наистина ли искате да изтриете този план за схема?"],"Attach a file by drag & drop or %{upload_link}":[""],"Branch":["Клон","Клонове"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["Клонът %{branch_name} беше създаден. За да настроите автоматичното внедряване, изберете Yaml шаблон за GitLab CI и подайте промените си. %{link_to_autodeploy_doc}"],"Branches":["Клонове"],"Browse files":[""],"ByAuthor|by":["от"],"CI configuration":["Конфигурация на непрекъсната интеграция"],"Cancel":["Отказ"],"ChangeTypeActionLabel|Pick into branch":[""],"ChangeTypeActionLabel|Revert in branch":[""],"ChangeTypeAction|Cherry-pick":[""],"ChangeType|commit":[""],"ChangeType|merge request":[""],"Changelog":["Списък с промени"],"Charts":["Графики"],"Cherry-pick this commit":[""],"Cherry-pick this merge-request":[""],"CiStatusLabel|canceled":["отказано"],"CiStatusLabel|created":["създадено"],"CiStatusLabel|failed":["неуспешно"],"CiStatusLabel|manual action":["ръчно действие"],"CiStatusLabel|passed":["успешно"],"CiStatusLabel|passed with warnings":["успешно, с предупреждения"],"CiStatusLabel|pending":["на изчакване"],"CiStatusLabel|skipped":["пропуснато"],"CiStatusLabel|waiting for manual action":["чакане за ръчно действие"],"CiStatusText|blocked":["блокирано"],"CiStatusText|canceled":["отказано"],"CiStatusText|created":["създадено"],"CiStatusText|failed":["неуспешно"],"CiStatusText|manual":["ръчно"],"CiStatusText|passed":["успешно"],"CiStatusText|pending":["на изчакване"],"CiStatusText|skipped":["пропуснато"],"CiStatus|running":["протича в момента"],"Commit":["Подаване","Подавания"],"Commit message":[""],"CommitMessage|Add %{file_name}":["Добавяне на „%{file_name}“"],"Commits":["Подавания"],"Commits|History":["История"],"Committed by":[""],"Compare":["Сравнение"],"Contribution guide":["Ръководство за сътрудничество"],"Contributors":["Сътрудници"],"Copy URL to clipboard":["Копиране на адреса в буфера за обмен"],"Copy commit SHA to clipboard":["Копиране на идентификатора на подаването в буфера за обмен"],"Create New Directory":["Създаване на нова папка"],"Create directory":["Създаване на папка"],"Create empty bare repository":["Създаване на празно хранилище"],"Create merge request":["Създаване на заявка за сливане"],"Create new...":[""],"CreateNewFork|Fork":["Разклоняване"],"CreateTag|Tag":[""],"Cron Timezone":["Часова зона за „Cron“"],"Cron syntax":[""],"Custom":[""],"Custom notification events":["Персонализирани събития за известяване"],"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}.":["Персонализираните нива на известяване са същите като нивата за участие. С персонализираните нива на известяване ще можете да получавате и известия за избрани събития. За да научите повече, прегледайте %{notification_link}."],"Cycle Analytics":["Анализ на циклите"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Define a custom pattern with cron syntax":[""],"Delete":["Изтриване"],"Deploy":["Внедряване","Внедрявания"],"Description":["Описание"],"Directory name":["Име на папката"],"Don't show again":["Да не се показва повече"],"Download":["Сваляне"],"Download tar":["Сваляне във формат „tar“"],"Download tar.bz2":["Сваляне във формат „tar.bz2“"],"Download tar.gz":["Сваляне във формат „tar.gz“"],"Download zip":["Сваляне във формат „zip“"],"DownloadArtifacts|Download":["Сваляне"],"DownloadCommit|Email Patches":[""],"DownloadCommit|Plain Diff":[""],"DownloadSource|Download":["Сваляне"],"Edit":["Редактиране"],"Edit Pipeline Schedule %{id}":["Редактиране на плана %{id} за схема"],"Every day (at 4:00am)":[""],"Every month (on the 1st at 4:00am)":[""],"Every week (Sundays at 4:00am)":[""],"Failed to change the owner":["Собственикът не може да бъде променен"],"Failed to remove the pipeline schedule":["Планът за схема не може да бъде премахнат"],"Files":["Файлове"],"Find by path":["Търсене по път"],"Find file":["Търсене на файл"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"Fork":["Наследяване",""],"ForkedFromProjectPath|Forked from":["Разклонение на"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Go to your fork":["Към Вашето разклонение"],"GoToYourFork|Fork":["Разклонение"],"Home":["Начало"],"Housekeeping successfully started":["Освежаването започна успешно"],"Import repository":["Внасяне на хранилище"],"Interval Pattern":["Шаблон за интервала"],"Introducing Cycle Analytics":["Представяме Ви анализа на циклите"],"LFSStatus|Disabled":["Изключено"],"LFSStatus|Enabled":["Включено"],"Last %d day":["Последния %d ден","Последните %d дни"],"Last Pipeline":["Последна схема"],"Last Update":["Последна промяна"],"Last commit":["Последно подаване"],"Learn more in the":[""],"Leave group":["Напускане на групата"],"Leave project":["Напускане на проекта"],"Limited to showing %d event at most":["Ограничено до показване на най-много %d събитие","Ограничено до показване на най-много %d събития"],"Median":["Медиана"],"MissingSSHKeyWarningLink|add an SSH key":["добавите SSH ключ"],"New Issue":["Нов проблем","Нови проблема"],"New Pipeline Schedule":["Нов план за схема"],"New branch":["Нов клон"],"New directory":["Нова папка"],"New file":["Нов файл"],"New issue":["Нов проблем"],"New merge request":["Нова заявка за сливане"],"New schedule":[""],"New snippet":["Нов отрязък"],"New tag":["Нов етикет"],"No repository":["Няма хранилище"],"No schedules":["Няма планове"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"Notification events":["Събития за известяване"],"NotificationEvent|Close issue":["Затваряне на проблем"],"NotificationEvent|Close merge request":["Затваряне на заявка за сливане"],"NotificationEvent|Failed pipeline":["Неуспешно изпълнение на схема"],"NotificationEvent|Merge merge request":["Прилагане на заявка за сливане"],"NotificationEvent|New issue":["Нов проблем"],"NotificationEvent|New merge request":["Нова заявка за сливане"],"NotificationEvent|New note":["Нова бележка"],"NotificationEvent|Reassign issue":["Преназначаване на проблем"],"NotificationEvent|Reassign merge request":["Преназначаване на заявка за сливане"],"NotificationEvent|Reopen issue":["Повторно отваряне на проблем"],"NotificationEvent|Successful pipeline":["Успешно изпълнение на схема"],"NotificationLevel|Custom":["Персонализирани"],"NotificationLevel|Disabled":["Изключени"],"NotificationLevel|Global":["Глобални"],"NotificationLevel|On mention":["При споменаване"],"NotificationLevel|Participate":["Участие"],"NotificationLevel|Watch":["Наблюдение"],"OfSearchInADropdown|Filter":[""],"OpenedNDaysAgo|Opened":["Отворен"],"Options":[""],"Owner":["Собственик"],"Pipeline":[""],"Pipeline Health":["Състояние"],"Pipeline Schedule":["План за схема"],"Pipeline Schedules":["Планове за схема"],"PipelineSchedules|Activated":["Включено"],"PipelineSchedules|Active":["Активно"],"PipelineSchedules|All":["Всички"],"PipelineSchedules|Inactive":["Неактивно"],"PipelineSchedules|Next Run":["Следващо изпълнение"],"PipelineSchedules|None":["Нищо"],"PipelineSchedules|Provide a short description for this pipeline":["Въведете кратко описание за тази схема"],"PipelineSchedules|Take ownership":["Поемане на собствеността"],"PipelineSchedules|Target":["Цел"],"Project '%{project_name}' queued for deletion.":["Проектът „%{project_name}“ е добавен в опашката за изтриване."],"Project '%{project_name}' was successfully created.":["Проектът „%{project_name}“ беше създаден успешно."],"Project '%{project_name}' was successfully updated.":["Проектът „%{project_name}“ беше обновен успешно."],"Project '%{project_name}' will be deleted.":["Проектът „%{project_name}“ ще бъде изтрит."],"Project access must be granted explicitly to each user.":["Достъпът до проекта трябва да бъде даван поотделно на всеки потребител."],"Project export could not be deleted.":["Изнесените данни на проекта не могат да бъдат изтрити."],"Project export has been deleted.":["Изнесените данни на проекта бяха изтрити."],"Project export link has expired. Please generate a new export from your project settings.":["Връзката към изнесените данни на проекта изгуби давност. Моля, създайте нова от настройките на проекта."],"Project export started. A download link will be sent by email.":["Изнасянето на проекта започна. Ще получите връзка към данните по е-поща."],"Project home":["Начална страница на проекта"],"ProjectFeature|Disabled":["Изключено"],"ProjectFeature|Everyone with access":["Всеки с достъп"],"ProjectFeature|Only team members":["Само членовете на екипа"],"ProjectFileTree|Name":["Име"],"ProjectLastActivity|Never":["Никога"],"ProjectLifecycle|Stage":["Етап"],"ProjectNetworkGraph|Graph":["Графика"],"Read more":["Прочетете повече"],"Readme":["ПрочетиМе"],"RefSwitcher|Branches":["Клонове"],"RefSwitcher|Tags":["Етикети"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани внедрени задачи"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Remind later":["Напомняне по-късно"],"Remove project":["Премахване на проекта"],"Request Access":["Заявка за достъп"],"Revert this commit":[""],"Revert this merge-request":[""],"Save pipeline schedule":["Запазване на плана за схема"],"Schedule a new pipeline":["Създаване на нов план за схема"],"Scheduling Pipelines":[""],"Search branches and tags":["Търсене в клоновете и етикетите"],"Select Archive Format":["Изберете формата на архива"],"Select a timezone":["Изберете часова зона"],"Select target branch":["Изберете целеви клон"],"Set a password on your account to pull or push via %{protocol}":["Задайте парола на профила си, за да можете да изтегляте и изпращате промени чрез %{protocol}"],"Set up CI":["Настройка на НИ"],"Set up Koding":["Настройка на „Koding“"],"Set up auto deploy":["Настройка на авт. внедряване"],"SetPasswordToCloneLink|set a password":["зададете парола"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"Source code":["Изходен код"],"StarProject|Star":["Звезда"],"Start a new merge request with these changes":[""],"Switch branch/tag":["Преминаване към клон/етикет"],"Tag":["Етикет","Етикети"],"Tags":["Етикети"],"Target Branch":["Целеви клон"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"The fork relationship has been removed.":["Връзката на разклонение беше премахната."],"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.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"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.":[""],"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.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"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.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия. Данните ще бъдат добавени автоматично след като завършите един пълен цикъл и превърнете първата си идея в реалност."],"The project can be accessed by any logged in user.":["Всеки вписан потребител има достъп до проекта."],"The project can be accessed without any authentication.":["Всеки може да има достъп до проекта, без нужда от удостоверяване."],"The repository for this project does not exist.":["Хранилището за този проект не съществува."],"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.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"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.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"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.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнението на първата Ви схема."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"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.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"This means you can not push code until you create an empty repository or import existing one.":["Това означава, че няма да можете да изпращате код, докато не създадете празно хранилище или не внесете съществуващо такова."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Timeago|%s days ago":["преди %s дни"],"Timeago|%s days remaining":["остават %s дни"],"Timeago|%s hours remaining":["остават %s часа"],"Timeago|%s minutes ago":["преди %s минути"],"Timeago|%s minutes remaining":["остават %s минути"],"Timeago|%s months ago":["преди %s месеца"],"Timeago|%s months remaining":["остават %s месеца"],"Timeago|%s seconds remaining":["остават %s секунди"],"Timeago|%s weeks ago":["преди %s седмици"],"Timeago|%s weeks remaining":["остават %s седмици"],"Timeago|%s years ago":["преди %s години"],"Timeago|%s years remaining":["остават %s години"],"Timeago|1 day remaining":["остава 1 ден"],"Timeago|1 hour remaining":["остава 1 час"],"Timeago|1 minute remaining":["остава 1 минута"],"Timeago|1 month remaining":["остава 1 месец"],"Timeago|1 week remaining":["остава 1 седмица"],"Timeago|1 year remaining":["остава 1 година"],"Timeago|Past due":["Просрочено"],"Timeago|a day ago":["преди един ден"],"Timeago|a month ago":["преди един месец"],"Timeago|a week ago":["преди една седмица"],"Timeago|a while":["преди известно време"],"Timeago|a year ago":["преди една година"],"Timeago|about %s hours ago":["преди около %s часа"],"Timeago|about a minute ago":["преди около една минута"],"Timeago|about an hour ago":["преди около един час"],"Timeago|in %s days":["след %s дни"],"Timeago|in %s hours":["след %s часа"],"Timeago|in %s minutes":["след %s минути"],"Timeago|in %s months":["след %s месеца"],"Timeago|in %s seconds":["след %s секунди"],"Timeago|in %s weeks":["след %s седмици"],"Timeago|in %s years":["след %s години"],"Timeago|in 1 day":["след 1 ден"],"Timeago|in 1 hour":["след 1 час"],"Timeago|in 1 minute":["след 1 минута"],"Timeago|in 1 month":["след 1 месец"],"Timeago|in 1 week":["след 1 седмица"],"Timeago|in 1 year":["след 1 година"],"Timeago|less than a minute ago":["преди по-малко от минута"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Unstar":["Без звезда"],"Upload New File":["Качване на нов файл"],"Upload file":["Качване на файл"],"Use your global notification setting":["Използване на глобалната Ви настройка за известията"],"VisibilityLevel|Internal":["Вътрешен"],"VisibilityLevel|Private":["Частен"],"VisibilityLevel|Public":["Публичен"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"Withdraw Access Request":["Оттегляне на заявката за достъп"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["На път сте да премахнете „%{project_name_with_namespace}“.\\nАко го премахнете, той НЕ може да бъде възстановен!\\nНАИСТИНА ли искате това?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":[""],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["На път сте да прехвърлите „%{project_name_with_namespace}“ към друг собственик. НАИСТИНА ли искате това?"],"You can only add files when you are on a branch":["Можете да добавяте файлове само когато се намирате в клон"],"You must sign in to star a project":["Трябва да се впишете, за да отбележите проект със звезда"],"You need permission.":["Нуждаете се от разрешение."],"You will not get any notifications via email":["Няма да получавате никакви известия по е-поща"],"You will only receive notifications for the events you choose":["Ще получавате известия само за събитията, за които желаете"],"You will only receive notifications for threads you have participated in":["Ще получавате известия само за нещата, в които участвате"],"You will receive notifications for any activity":["Ще получавате известия за всяка дейност"],"You will receive notifications only for comments in which you were @mentioned":["Ще получавате известия само за коментари, в които Ви @споменават"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["Няма да можете да изтегляте или изпращате код в проекта чрез %{protocol}, докато не %{set_password_link} за профила си"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["Няма да можете да изтегляте или изпращате код в проекта чрез SSH, докато не %{add_ssh_key_link} в профила си"],"Your name":["Вашето име"],"day":["ден","дни"],"notification emails":["известия по е-поща"],"parent":["",""],"pipeline schedules documentation":[""],"with stage":["",""]}}}; \ No newline at end of file diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po index 41805a7792e..fd00796d763 100644 --- a/locale/bg/gitlab.po +++ b/locale/bg/gitlab.po @@ -3,34 +3,245 @@ msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-07 21:22+0200\n" +"POT-Creation-Date: 2017-06-12 19:29-0500\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-10 03:35-0400\n" +"PO-Revision-Date: 2017-06-12 09:36-0400\n" "Last-Translator: Lyubomir Vasilev \n" -"Language-Team: Bulgarian\n" +"Language-Team: Bulgarian (https://translate.zanata.org/project/view/GitLab)\n" "Language: bg\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +msgid "%{commit_author_link} committed %{commit_timeago}" +msgstr "" + +msgid "About auto deploy" +msgstr "Относно автоматичното внедряване" + +msgid "Active" +msgstr "" + +msgid "Activity" +msgstr "Дейност" + +msgid "Add Changelog" +msgstr "Добавяне на списък с промени" + +msgid "Add Contribution guide" +msgstr "Добавяне на ръководство за сътрудничество" + +msgid "Add License" +msgstr "Добавяне на лиценз" + +msgid "Add an SSH key to your profile to pull or push via SSH." +msgstr "" +"Добавете SSH ключ в профила си, за да можете да изтегляте или изпращате " +"промени чрез SSH." + +msgid "Add new directory" +msgstr "Добавяне на нова папка" + +msgid "Archived project! Repository is read-only" +msgstr "Архивиран проект! Хранилището е само за четене" + msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Наистина ли искате да изтриете този план за схема?" +msgid "Attach a file by drag & drop or %{upload_link}" +msgstr "" + +msgid "Branch" +msgid_plural "Branches" +msgstr[0] "Клон" +msgstr[1] "Клонове" + +msgid "" +"Branch %{branch_name} was created. To set up auto deploy, " +"choose a GitLab CI Yaml template and commit your changes. " +"%{link_to_autodeploy_doc}" +msgstr "" +"Клонът %{branch_name} беше създаден. За да настроите " +"автоматичното внедряване, изберете Yaml шаблон за GitLab CI и подайте " +"промените си. %{link_to_autodeploy_doc}" + +msgid "Branches" +msgstr "Клонове" + +msgid "Browse files" +msgstr "" + msgid "ByAuthor|by" msgstr "от" +msgid "CI configuration" +msgstr "Конфигурация на непрекъсната интеграция" + msgid "Cancel" msgstr "Отказ" +msgid "ChangeTypeActionLabel|Pick into branch" +msgstr "" + +msgid "ChangeTypeActionLabel|Revert in branch" +msgstr "" + +msgid "ChangeTypeAction|Cherry-pick" +msgstr "" + +msgid "ChangeType|commit" +msgstr "" + +msgid "ChangeType|merge request" +msgstr "" + +msgid "Changelog" +msgstr "Списък с промени" + +msgid "Charts" +msgstr "Графики" + +msgid "Cherry-pick this commit" +msgstr "" + +msgid "Cherry-pick this merge-request" +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 "Commit" msgid_plural "Commits" msgstr[0] "Подаване" msgstr[1] "Подавания" +msgid "Commit message" +msgstr "" + +msgid "CommitMessage|Add %{file_name}" +msgstr "Добавяне на „%{file_name}“" + +msgid "Commits" +msgstr "Подавания" + +msgid "Commits|History" +msgstr "История" + +msgid "Committed by" +msgstr "" + +msgid "Compare" +msgstr "Сравнение" + +msgid "Contribution guide" +msgstr "Ръководство за сътрудничество" + +msgid "Contributors" +msgstr "Сътрудници" + +msgid "Copy URL to clipboard" +msgstr "Копиране на адреса в буфера за обмен" + +msgid "Copy commit SHA to clipboard" +msgstr "Копиране на идентификатора на подаването в буфера за обмен" + +msgid "Create New Directory" +msgstr "Създаване на нова папка" + +msgid "Create directory" +msgstr "Създаване на папка" + +msgid "Create empty bare repository" +msgstr "Създаване на празно хранилище" + +msgid "Create merge request" +msgstr "Създаване на заявка за сливане" + +msgid "Create new..." +msgstr "" + +msgid "CreateNewFork|Fork" +msgstr "Разклоняване" + +msgid "CreateTag|Tag" +msgstr "" + msgid "Cron Timezone" msgstr "Часова зона за „Cron“" +msgid "Cron syntax" +msgstr "" + +msgid "Custom" +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 "" +"Персонализираните нива на известяване са същите като нивата за участие. С " +"персонализираните нива на известяване ще можете да получавате и известия за " +"избрани събития. За да научите повече, прегледайте %{notification_link}." + +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." @@ -59,6 +270,9 @@ msgstr "Подготовка за издаване" msgid "CycleAnalyticsStage|Test" msgstr "Тестване" +msgid "Define a custom pattern with cron syntax" +msgstr "" + msgid "Delete" msgstr "Изтриване" @@ -70,20 +284,68 @@ msgstr[1] "Внедрявания" msgid "Description" msgstr "Описание" +msgid "Directory name" +msgstr "Име на папката" + +msgid "Don't show again" +msgstr "Да не се показва повече" + +msgid "Download" +msgstr "Сваляне" + +msgid "Download tar" +msgstr "Сваляне във формат „tar“" + +msgid "Download tar.bz2" +msgstr "Сваляне във формат „tar.bz2“" + +msgid "Download tar.gz" +msgstr "Сваляне във формат „tar.gz“" + +msgid "Download zip" +msgstr "Сваляне във формат „zip“" + +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 "Редактиране на плана %{id} за схема" +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 "Failed to change the owner" msgstr "Собственикът не може да бъде променен" msgid "Failed to remove the pipeline schedule" msgstr "Планът за схема не може да бъде премахнат" -msgid "Filter" -msgstr "Филтриране" +msgid "Files" +msgstr "Файлове" + +msgid "Find by path" +msgstr "Търсене по път" + +msgid "Find file" +msgstr "Търсене на файл" msgid "FirstPushedBy|First" msgstr "Първо" @@ -91,6 +353,15 @@ msgstr "Първо" msgid "FirstPushedBy|pushed by" msgstr "изпращане на промени от" +#, fuzzy +msgid "Fork" +msgid_plural "Forks" +msgstr[0] "Наследяване" +msgstr[1] "" + +msgid "ForkedFromProjectPath|Forked from" +msgstr "Разклонение на" + msgid "From issue creation until deploy to production" msgstr "От създаването на проблема до внедряването в крайната версия" @@ -98,12 +369,33 @@ msgid "From merge request merge until deploy to production" msgstr "" "От прилагането на заявката за сливане до внедряването в крайната версия" +msgid "Go to your fork" +msgstr "Към Вашето разклонение" + +msgid "GoToYourFork|Fork" +msgstr "Разклонение" + +msgid "Home" +msgstr "Начало" + +msgid "Housekeeping successfully started" +msgstr "Освежаването започна успешно" + +msgid "Import repository" +msgstr "Внасяне на хранилище" + msgid "Interval Pattern" msgstr "Шаблон за интервала" msgid "Introducing Cycle Analytics" msgstr "Представяме Ви анализа на циклите" +msgid "LFSStatus|Disabled" +msgstr "Изключено" + +msgid "LFSStatus|Enabled" +msgstr "Включено" + msgid "Last %d day" msgid_plural "Last %d days" msgstr[0] "Последния %d ден" @@ -112,14 +404,32 @@ msgstr[1] "Последните %d дни" msgid "Last Pipeline" msgstr "Последна схема" +msgid "Last Update" +msgstr "Последна промяна" + +msgid "Last commit" +msgstr "Последно подаване" + +msgid "Learn more in the" +msgstr "" + +msgid "Leave group" +msgstr "Напускане на групата" + +msgid "Leave project" +msgstr "Напускане на проекта" + msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" -msgstr[0] "Ограничено до показване на последното %d събитие" -msgstr[1] "Ограничено до показване на последните %d събития" +msgstr[0] "Ограничено до показване на най-много %d събитие" +msgstr[1] "Ограничено до показване на най-много %d събития" msgid "Median" msgstr "Медиана" +msgid "MissingSSHKeyWarningLink|add an SSH key" +msgstr "добавите SSH ключ" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "Нов проблем" @@ -128,6 +438,33 @@ msgstr[1] "Нови проблема" msgid "New Pipeline Schedule" msgstr "Нов план за схема" +msgid "New branch" +msgstr "Нов клон" + +msgid "New directory" +msgstr "Нова папка" + +msgid "New file" +msgstr "Нов файл" + +msgid "New issue" +msgstr "Нов проблем" + +msgid "New merge request" +msgstr "Нова заявка за сливане" + +msgid "New schedule" +msgstr "" + +msgid "New snippet" +msgstr "Нов отрязък" + +msgid "New tag" +msgstr "Нов етикет" + +msgid "No repository" +msgstr "Няма хранилище" + msgid "No schedules" msgstr "Няма планове" @@ -137,12 +474,75 @@ 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 "OfSearchInADropdown|Filter" +msgstr "" + msgid "OpenedNDaysAgo|Opened" msgstr "Отворен" +msgid "Options" +msgstr "" + msgid "Owner" msgstr "Собственик" +msgid "Pipeline" +msgstr "" + msgid "Pipeline Health" msgstr "Състояние" @@ -179,17 +579,80 @@ msgstr "Поемане на собствеността" msgid "PipelineSchedules|Target" msgstr "Цел" +msgid "Project '%{project_name}' queued for deletion." +msgstr "Проектът „%{project_name}“ е добавен в опашката за изтриване." + +msgid "Project '%{project_name}' was successfully created." +msgstr "Проектът „%{project_name}“ беше създаден успешно." + +msgid "Project '%{project_name}' was successfully updated." +msgstr "Проектът „%{project_name}“ беше обновен успешно." + +msgid "Project '%{project_name}' will be deleted." +msgstr "Проектът „%{project_name}“ ще бъде изтрит." + +msgid "Project access must be granted explicitly to each user." +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 "Project home" +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 "Read more" msgstr "Прочетете повече" +msgid "Readme" +msgstr "ПрочетиМе" + +msgid "RefSwitcher|Branches" +msgstr "Клонове" + +msgid "RefSwitcher|Tags" +msgstr "Етикети" + msgid "Related Commits" msgstr "Свързани подавания" msgid "Related Deployed Jobs" -msgstr "Свързани задачи за внедряване" +msgstr "Свързани внедрени задачи" msgid "Related Issues" msgstr "Свързани проблеми" @@ -203,23 +666,84 @@ msgstr "Свързани заявки за сливане" msgid "Related Merged Requests" msgstr "Свързани приложени заявки за сливане" +msgid "Remind later" +msgstr "Напомняне по-късно" + +msgid "Remove project" +msgstr "Премахване на проекта" + +msgid "Request Access" +msgstr "Заявка за достъп" + +msgid "Revert this commit" +msgstr "" + +msgid "Revert this merge-request" +msgstr "" + msgid "Save pipeline schedule" msgstr "Запазване на плана за схема" msgid "Schedule a new pipeline" msgstr "Създаване на нов план за схема" +msgid "Scheduling Pipelines" +msgstr "" + +msgid "Search branches and tags" +msgstr "Търсене в клоновете и етикетите" + +msgid "Select Archive Format" +msgstr "Изберете формата на архива" + msgid "Select a timezone" msgstr "Изберете часова зона" msgid "Select target branch" msgstr "Изберете целеви клон" +msgid "Set a password on your account to pull or push via %{protocol}" +msgstr "" +"Задайте парола на профила си, за да можете да изтегляте и изпращате промени " +"чрез %{protocol}" + +msgid "Set up CI" +msgstr "Настройка на НИ" + +msgid "Set up Koding" +msgstr "Настройка на „Koding“" + +msgid "Set up auto deploy" +msgstr "Настройка на авт. внедряване" + +msgid "SetPasswordToCloneLink|set a password" +msgstr "зададете парола" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "Показване на %d събитие" msgstr[1] "Показване на %d събития" +msgid "Source code" +msgstr "Изходен код" + +msgid "StarProject|Star" +msgstr "Звезда" + +msgid "Start a new merge request with these changes" +msgstr "" + +msgid "Switch branch/tag" +msgstr "Преминаване към клон/етикет" + +msgid "Tag" +msgid_plural "Tags" +msgstr[0] "Етикет" +msgstr[1] "Етикети" + +msgid "Tags" +msgstr "Етикети" + msgid "Target Branch" msgstr "Целеви клон" @@ -235,6 +759,9 @@ 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. " @@ -248,6 +775,12 @@ 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 " @@ -263,7 +796,18 @@ msgid "" "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 " @@ -305,6 +849,13 @@ msgstr "" "данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е " "(5+7)/2 = 6." +msgid "" +"This means you can not push code until you create an empty repository or " +"import existing one." +msgstr "" +"Това означава, че няма да можете да изпращате код, докато не създадете " +"празно хранилище или не внесете съществуващо такова." + msgid "Time before an issue gets scheduled" msgstr "Време преди един проблем да бъде планиран за работа" @@ -318,6 +869,129 @@ msgstr "" msgid "Time until first merge request" msgstr "Време преди първата заявка за сливане" +msgid "Timeago|%s days ago" +msgstr "преди %s дни" + +msgid "Timeago|%s days remaining" +msgstr "остават %s дни" + +msgid "Timeago|%s hours remaining" +msgstr "остават %s часа" + +msgid "Timeago|%s minutes ago" +msgstr "преди %s минути" + +msgid "Timeago|%s minutes remaining" +msgstr "остават %s минути" + +msgid "Timeago|%s months ago" +msgstr "преди %s месеца" + +msgid "Timeago|%s months remaining" +msgstr "остават %s месеца" + +msgid "Timeago|%s seconds remaining" +msgstr "остават %s секунди" + +msgid "Timeago|%s weeks ago" +msgstr "преди %s седмици" + +msgid "Timeago|%s weeks remaining" +msgstr "остават %s седмици" + +msgid "Timeago|%s years ago" +msgstr "преди %s години" + +msgid "Timeago|%s years remaining" +msgstr "остават %s години" + +msgid "Timeago|1 day remaining" +msgstr "остава 1 ден" + +msgid "Timeago|1 hour remaining" +msgstr "остава 1 час" + +msgid "Timeago|1 minute remaining" +msgstr "остава 1 минута" + +msgid "Timeago|1 month remaining" +msgstr "остава 1 месец" + +msgid "Timeago|1 week remaining" +msgstr "остава 1 седмица" + +msgid "Timeago|1 year remaining" +msgstr "остава 1 година" + +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 while" +msgstr "преди известно време" + +msgid "Timeago|a year ago" +msgstr "преди една година" + +msgid "Timeago|about %s hours ago" +msgstr "преди около %s часа" + +msgid "Timeago|about a minute ago" +msgstr "преди около една минута" + +msgid "Timeago|about an hour ago" +msgstr "преди около един час" + +msgid "Timeago|in %s days" +msgstr "след %s дни" + +msgid "Timeago|in %s hours" +msgstr "след %s часа" + +msgid "Timeago|in %s minutes" +msgstr "след %s минути" + +msgid "Timeago|in %s months" +msgstr "след %s месеца" + +msgid "Timeago|in %s seconds" +msgstr "след %s секунди" + +msgid "Timeago|in %s weeks" +msgstr "след %s седмици" + +msgid "Timeago|in %s years" +msgstr "след %s години" + +msgid "Timeago|in 1 day" +msgstr "след 1 ден" + +msgid "Timeago|in 1 hour" +msgstr "след 1 час" + +msgid "Timeago|in 1 minute" +msgstr "след 1 минута" + +msgid "Timeago|in 1 month" +msgstr "след 1 месец" + +msgid "Timeago|in 1 week" +msgstr "след 1 седмица" + +msgid "Timeago|in 1 year" +msgstr "след 1 година" + +msgid "Timeago|less than a minute ago" +msgstr "преди по-малко от минута" + msgid "Time|hr" msgid_plural "Time|hrs" msgstr[0] "час" @@ -337,17 +1011,119 @@ msgstr "Общо време" msgid "Total test time for all commits/merges" msgstr "Общо време за тестване на всички подавания/сливания" +msgid "Unstar" +msgstr "Без звезда" + +msgid "Upload New File" +msgstr "Качване на нов файл" + +msgid "Upload file" +msgstr "Качване на файл" + +msgid "Use your global notification setting" +msgstr "Използване на глобалната Ви настройка за известията" + +msgid "VisibilityLevel|Internal" +msgstr "Вътрешен" + +msgid "VisibilityLevel|Private" +msgstr "Частен" + +msgid "VisibilityLevel|Public" +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 "Withdraw Access Request" +msgstr "Оттегляне на заявката за достъп" + +msgid "" +"You are going to remove %{project_name_with_namespace}.\n" +"Removed project CANNOT be restored!\n" +"Are you ABSOLUTELY sure?" +msgstr "" +"На път сте да премахнете „%{project_name_with_namespace}“.\n" +"Ако го премахнете, той НЕ може да бъде възстановен!\n" +"НАИСТИНА ли искате това?" + +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 "" +"На път сте да прехвърлите „%{project_name_with_namespace}“ към друг " +"собственик. НАИСТИНА ли искате това?" + +msgid "You can only add files when you are on a branch" +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 "" +"Няма да можете да изтегляте или изпращате код в проекта чрез %{protocol}, " +"докато не %{set_password_link} за профила си" + +msgid "" +"You won't be able to pull or push project code via SSH until you " +"%{add_ssh_key_link} to your profile" +msgstr "" +"Няма да можете да изтегляте или изпращате код в проекта чрез SSH, докато не " +"%{add_ssh_key_link} в профила си" + +msgid "Your name" +msgstr "Вашето име" + msgid "day" msgid_plural "days" msgstr[0] "ден" msgstr[1] "дни" +msgid "notification emails" +msgstr "известия по е-поща" + +msgid "parent" +msgid_plural "parents" +msgstr[0] "" +msgstr[1] "" + +msgid "pipeline schedules documentation" +msgstr "" + +msgid "with stage" +msgid_plural "with stages" +msgstr[0] "" +msgstr[1] "" + From 02d7cd41dccfa74a726f31e599dd863237320c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 13 Jun 2017 11:25:16 +0800 Subject: [PATCH 0062/1380] Optimization 'zh_HK' translation 1. Fix missing translations --- app/assets/javascripts/locale/zh_HK/app.js | 2 +- locale/zh_HK/gitlab.po | 763 ++++++++++++++++++++- locale/zh_HK/gitlab.po.time_stamp | 1 + 3 files changed, 755 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/locale/zh_HK/app.js b/app/assets/javascripts/locale/zh_HK/app.js index fcd5795c8bb..bfc6f7e5db4 100644 --- a/app/assets/javascripts/locale/zh_HK/app.js +++ b/app/assets/javascripts/locale/zh_HK/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-07 21:22+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-09 01:09-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://www.transifex.com/gitlab-zh/teams/75177/zh_HK/)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"Are you sure you want to delete this pipeline schedule?":["您確定要刪除此流水線計劃嗎?"],"ByAuthor|by":["作者:"],"Cancel":["取消"],"Commit":["提交"],"Cron Timezone":["Cron 時區"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Delete":["刪除"],"Deploy":["部署"],"Description":["描述"],"Edit":["編輯"],"Edit Pipeline Schedule %{id}":["編輯 %{id} 流水線計劃"],"Failed to change the owner":["無法變更所有者"],"Failed to remove the pipeline schedule":["無法刪除流水線計劃"],"Filter":["過濾"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Interval Pattern":["間隔模式"],"Introducing Cycle Analytics":["週期分析簡介"],"Last %d day":["最後 %d 天"],"Last Pipeline":["最新流水線"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"New Issue":["新議題"],"New Pipeline Schedule":["創建流水線計劃"],"No schedules":["沒有計劃"],"Not available":["不可用"],"Not enough data":["數據不足"],"OpenedNDaysAgo|Opened":["開始於"],"Owner":["所有者"],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":["流水線計劃"],"Pipeline Schedules":["流水線計劃"],"PipelineSchedules|Activated":["已激活"],"PipelineSchedules|Active":["激活"],"PipelineSchedules|All":["所有"],"PipelineSchedules|Inactive":["等待"],"PipelineSchedules|Next Run":["下壹個運行"],"PipelineSchedules|None":["無"],"PipelineSchedules|Provide a short description for this pipeline":["為此流水線提供簡短描述"],"PipelineSchedules|Take ownership":["取得所有權"],"PipelineSchedules|Target":["目標"],"ProjectLifecycle|Stage":["階段"],"Read more":["了解更多"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合併請求"],"Save pipeline schedule":["保存流水線計劃"],"Schedule a new pipeline":["新增流水線計劃"],"Select a timezone":["選擇時區"],"Select target branch":["選擇目標分支"],"Showing %d event":["顯示 %d 個事件"],"Target Branch":["目標分支"],"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.":["編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建壹個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"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.":["評審階段概述了從創建合併請求到合併的時間。當創建第壹個合併請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合併或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"You need permission.":["您需要相關的權限。"],"day":["天"]}}}; \ No newline at end of file +var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-12 11:08-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"%{commit_author_link} committed %{commit_timeago}":["由 %{commit_author_link} 提交於 %{commit_timeago}"],"About auto deploy":["關於自動部署"],"Active":["激活"],"Activity":["活動"],"Add Changelog":["添加變更日誌"],"Add Contribution guide":["添加貢獻指南"],"Add License":["添加許可證"],"Add an SSH key to your profile to pull or push via SSH.":["新增壹個用於推送或拉取的 SSH 秘鑰到您的個人賬戶中。"],"Add new directory":["添加新目錄"],"Archived project! Repository is read-only":["歸檔項目!存儲庫為只讀"],"Are you sure you want to delete this pipeline schedule?":["您確定要刪除此流水線計劃嗎?"],"Attach a file by drag & drop or %{upload_link}":["拖放文件到此處或者 %{upload_link}"],"Branch":["分支"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["分支 %{branch_name} 已創建。如要設置自動部署, 請選擇合適的 GitLab CI Yaml 模板併提交更改。%{link_to_autodeploy_doc}"],"Branches":["分支"],"Browse files":["瀏覽文件"],"ByAuthor|by":["作者:"],"CI configuration":["CI 配置"],"Cancel":["取消"],"ChangeTypeActionLabel|Pick into branch":["挑選到分支"],"ChangeTypeActionLabel|Revert in branch":["還原分支"],"ChangeTypeAction|Cherry-pick":["優選"],"ChangeType|commit":["提交"],"ChangeType|merge request":["合併請求"],"Changelog":["變更日誌"],"Charts":["統計圖"],"Cherry-pick this commit":["優選此提交"],"Cherry-pick this merge-request":["優選此合併請求"],"CiStatusLabel|canceled":["已取消"],"CiStatusLabel|created":["已創建"],"CiStatusLabel|failed":["已失敗"],"CiStatusLabel|manual action":["手動操作"],"CiStatusLabel|passed":["已通過"],"CiStatusLabel|passed with warnings":["已通過但有警告"],"CiStatusLabel|pending":["等待中"],"CiStatusLabel|skipped":["已跳過"],"CiStatusLabel|waiting for manual action":["等待手動操作"],"CiStatusText|blocked":["已阻塞"],"CiStatusText|canceled":["已取消"],"CiStatusText|created":["已創建"],"CiStatusText|failed":["已失敗"],"CiStatusText|manual":["待手動"],"CiStatusText|passed":["已通過"],"CiStatusText|pending":["等待中"],"CiStatusText|skipped":["已跳過"],"CiStatus|running":["運行中"],"Commit":["提交"],"Commit message":["提交信息"],"CommitMessage|Add %{file_name}":["添加 %{file_name}"],"Commits":["提交"],"Commits|History":["歷史"],"Committed by":["作者:"],"Compare":["比較"],"Contribution guide":["貢獻指南"],"Contributors":["貢獻者"],"Copy URL to clipboard":["複製URL到剪貼板"],"Copy commit SHA to clipboard":["複製提交 SHA 到剪貼板"],"Create New Directory":["創建新目錄"],"Create directory":["創建目錄"],"Create empty bare repository":["創建空的存儲庫"],"Create merge request":["創建合併請求"],"Create new...":["創建..."],"CreateNewFork|Fork":["派生"],"CreateTag|Tag":["標簽"],"Cron Timezone":["Cron 時區"],"Cron syntax":["Cron 語法"],"Custom":["自定義"],"Custom notification events":["自定義通知事件"],"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}.":["自定義通知級別與參與級別相同。使用自定義通知級別,您只能收到所選定事件通知。想瞭解更多信息,請查看 %{notification_link}."],"Cycle Analytics":["週期分析"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Define a custom pattern with cron syntax":["使用 Cron 語法定義自定義模式"],"Delete":["刪除"],"Deploy":["部署"],"Description":["描述"],"Directory name":["目錄名稱"],"Don't show again":["不再顯示"],"Download":["下載"],"Download tar":["下載 tar"],"Download tar.bz2":["下載 tar.bz2"],"Download tar.gz":["下載 tar.gz"],"Download zip":["下載 zip"],"DownloadArtifacts|Download":["下載"],"DownloadCommit|Email Patches":["電子郵件補丁"],"DownloadCommit|Plain Diff":["Diff 文件"],"DownloadSource|Download":["下載"],"Edit":["編輯"],"Edit Pipeline Schedule %{id}":["編輯 %{id} 流水線計劃"],"Every day (at 4:00am)":["每天(淩晨4點)"],"Every month (on the 1st at 4:00am)":["每月1日(淩晨4點)"],"Every week (Sundays at 4:00am)":["每周日(淩晨4點)"],"Failed to change the owner":["無法變更所有者"],"Failed to remove the pipeline schedule":["無法刪除流水線計劃"],"Files":["文件"],"Find by path":["按路徑查找"],"Find file":["查找文件"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"Fork":["派生"],"ForkedFromProjectPath|Forked from":["派生自"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Go to your fork":["跳轉到您的派生項目"],"GoToYourFork|Fork":["跳轉到您的派生項目"],"Home":["首頁"],"Housekeeping successfully started":["已開始維護"],"Import repository":["導入存儲庫"],"Interval Pattern":["間隔模式"],"Introducing Cycle Analytics":["週期分析簡介"],"LFSStatus|Disabled":["禁用"],"LFSStatus|Enabled":["啟用"],"Last %d day":["最後 %d 天"],"Last Pipeline":["最新流水線"],"Last Update":["最後更新"],"Last commit":["最後提交"],"Learn more in the":["了解更多"],"Leave group":["離開群組"],"Leave project":["離開項目"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"MissingSSHKeyWarningLink|add an SSH key":["添加壹個 SSH 公鑰"],"New Issue":["新議題"],"New Pipeline Schedule":["創建流水線計劃"],"New branch":["新分支"],"New directory":["新增目錄"],"New file":["新增文件"],"New issue":["新議題"],"New merge request":["新合併請求"],"New schedule":["新计划"],"New snippet":["新代碼片段"],"New tag":["新標籤"],"No repository":["沒有存儲庫"],"No schedules":["沒有計劃"],"Not available":["不可用"],"Not enough data":["數據不足"],"Notification events":["通知事件"],"NotificationEvent|Close issue":["關閉議題"],"NotificationEvent|Close merge request":["關閉合併請求"],"NotificationEvent|Failed pipeline":["流水線失敗"],"NotificationEvent|Merge merge request":["合併請求被合併"],"NotificationEvent|New issue":["新議題"],"NotificationEvent|New merge request":["新合併請求"],"NotificationEvent|New note":["新評論"],"NotificationEvent|Reassign issue":["重新指派議題"],"NotificationEvent|Reassign merge request":["重新指派合併請求"],"NotificationEvent|Reopen issue":["重新打開議題"],"NotificationEvent|Successful pipeline":["流水線成功完成"],"NotificationLevel|Custom":["自定義"],"NotificationLevel|Disabled":["禁用"],"NotificationLevel|Global":["全局"],"NotificationLevel|On mention":["提及"],"NotificationLevel|Participate":["參與"],"NotificationLevel|Watch":["關注"],"OfSearchInADropdown|Filter":["篩選"],"OpenedNDaysAgo|Opened":["開始於"],"Options":["選項"],"Owner":["所有者"],"Pipeline":["流水線"],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":["流水線計劃"],"Pipeline Schedules":["流水線計劃"],"PipelineSchedules|Activated":["已激活"],"PipelineSchedules|Active":["激活"],"PipelineSchedules|All":["所有"],"PipelineSchedules|Inactive":["等待"],"PipelineSchedules|Next Run":["下壹個運行"],"PipelineSchedules|None":["無"],"PipelineSchedules|Provide a short description for this pipeline":["為此流水線提供簡短描述"],"PipelineSchedules|Take ownership":["取得所有權"],"PipelineSchedules|Target":["目標"],"Project '%{project_name}' queued for deletion.":["項目 '%{project_name}' 已進入刪除隊列。"],"Project '%{project_name}' was successfully created.":["項目 '%{project_name}' 已創建完成。"],"Project '%{project_name}' was successfully updated.":["項目 '%{project_name}' 已更新完成。"],"Project '%{project_name}' will be deleted.":["項目 '%{project_name}' 已刪除。"],"Project access must be granted explicitly to each user.":["項目訪問權限必須明確授權給每個用戶。"],"Project export could not be deleted.":["無法刪除項目導出。"],"Project export has been deleted.":["項目導出已刪除。"],"Project export link has expired. Please generate a new export from your project settings.":["項目導出鏈接已過期。請從項目設置中重新生成項目導出。"],"Project export started. A download link will be sent by email.":["項目導出已開始。下載鏈接將通過電子郵件發送。"],"Project home":["項目首頁"],"ProjectFeature|Disabled":["禁用"],"ProjectFeature|Everyone with access":["任何人都可訪問"],"ProjectFeature|Only team members":["只有團隊成員"],"ProjectFileTree|Name":["名稱"],"ProjectLastActivity|Never":["從未"],"ProjectLifecycle|Stage":["階段"],"ProjectNetworkGraph|Graph":["分支圖"],"Read more":["了解更多"],"Readme":["自述文件"],"RefSwitcher|Branches":["分支"],"RefSwitcher|Tags":["標籤"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合併請求"],"Remind later":["稍後提醒"],"Remove project":["刪除項目"],"Request Access":["申請訪問"],"Revert this commit":["還原此提交"],"Revert this merge-request":["還原此合併請求"],"Save pipeline schedule":["保存流水線計劃"],"Schedule a new pipeline":["新增流水線計劃"],"Scheduling Pipelines":["流水線計劃"],"Search branches and tags":["搜索分支和標籤"],"Select Archive Format":["選擇下載格式"],"Select a timezone":["選擇時區"],"Select target branch":["選擇目標分支"],"Set a password on your account to pull or push via %{protocol}":["為您的賬戶添加壹個用於推送或拉取的 %{protocol} 密碼。"],"Set up CI":["設置 CI"],"Set up Koding":["設置 Koding"],"Set up auto deploy":["設置自動部署"],"SetPasswordToCloneLink|set a password":["設置密碼"],"Showing %d event":["顯示 %d 個事件"],"Source code":["源代碼"],"StarProject|Star":["星標"],"Start a new merge request with these changes":["包含這些更改到 新合併請求"],"Switch branch/tag":["切換分支/標籤"],"Tag":["標籤"],"Tags":["標籤"],"Target Branch":["目標分支"],"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.":["編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"The fork relationship has been removed.":["派生關係已被刪除。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建壹個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["流水線計劃會針對特定的分支或標簽在以後重復運行流水線。這些預定的流水線將根據其相關用戶繼承有限的項目訪問。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"The project can be accessed by any logged in user.":["該項目允許已登錄的用戶訪問。"],"The project can be accessed without any authentication.":["該項目允許任何人訪問。"],"The repository for this project does not exist.":["此項目的存儲庫不存在。"],"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.":["評審階段概述了從創建合併請求到合併的時間。當創建第壹個合併請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"This means you can not push code until you create an empty repository or import existing one.":["在創建壹個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合併或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Timeago|%s days ago":["%s 天前"],"Timeago|%s days remaining":["剩餘 %s 天"],"Timeago|%s hours remaining":["剩餘 %s 小時"],"Timeago|%s minutes ago":["%s 分鐘前"],"Timeago|%s minutes remaining":["剩餘 %s 分鐘"],"Timeago|%s months ago":["%s 個月前"],"Timeago|%s months remaining":["剩餘 %s 月"],"Timeago|%s seconds remaining":["剩餘 %s 秒"],"Timeago|%s weeks ago":["%s 星期前"],"Timeago|%s weeks remaining":["剩餘 %s 星期"],"Timeago|%s years ago":["%s 年前"],"Timeago|%s years remaining":["剩餘 %s 年"],"Timeago|1 day remaining":["剩餘 1 天"],"Timeago|1 hour remaining":["剩餘 1 小時"],"Timeago|1 minute remaining":["剩餘 1 分鐘"],"Timeago|1 month remaining":["剩餘 1 個月"],"Timeago|1 week remaining":["剩餘 1 星期"],"Timeago|1 year remaining":["剩餘 1 年"],"Timeago|Past due":["逾期"],"Timeago|a day ago":["1 天前"],"Timeago|a month ago":["1 個月前"],"Timeago|a week ago":["1 星期前"],"Timeago|a while":["剛剛"],"Timeago|a year ago":["1 年前"],"Timeago|about %s hours ago":["大約 %s 小時前"],"Timeago|about a minute ago":["大約 1 分鐘前"],"Timeago|about an hour ago":["大約 1 小時前"],"Timeago|in %s days":["在 %s 天"],"Timeago|in %s hours":["在 %s 小時"],"Timeago|in %s minutes":["在 %s 分鐘"],"Timeago|in %s months":["在 %s 個月"],"Timeago|in %s seconds":["在 %s 秒"],"Timeago|in %s weeks":["在 %s 星期"],"Timeago|in %s years":["在 %s 年"],"Timeago|in 1 day":["在 1 天"],"Timeago|in 1 hour":["在 1 小時"],"Timeago|in 1 minute":["在 1 分鐘"],"Timeago|in 1 month":["在 1 月"],"Timeago|in 1 week":["在 1 星期"],"Timeago|in 1 year":["在 1 年"],"Timeago|less than a minute ago":["不到 1 分鐘前"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Unstar":["取消星標"],"Upload New File":["上傳新文件"],"Upload file":["上傳文件"],"Use your global notification setting":["使用全局通知設置"],"VisibilityLevel|Internal":["內部"],"VisibilityLevel|Private":["私有"],"VisibilityLevel|Public":["公開"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"Withdraw Access Request":["取消訪問請求"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["您將要刪除 %{project_name_with_namespace}。\\n已刪除的項目無法恢復!\\n您確定繼續嗎?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["您將刪除與源項目 %{forked_from_project} 的派生關系。您確定繼續嗎?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["將 %{project_name_with_namespace} 轉義給另壹個所有者。您確定繼續嗎?"],"You can only add files when you are on a branch":["您只能在分支上添加文件"],"You must sign in to star a project":["您必須登錄才能對項目加星標"],"You need permission.":["您需要相關的權限。"],"You will not get any notifications via email":["您將不會收到任何通知郵件"],"You will only receive notifications for the events you choose":["您只會收到您選擇的事件通知"],"You will only receive notifications for threads you have participated in":["您只會收到您參與的主題的通知"],"You will receive notifications for any activity":["您將不會收到任何通知"],"You will receive notifications only for comments in which you were @mentioned":["您只會收到評論中提及(@)您的通知"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["在您的賬戶上 %{set_password_link} 之前, 您將無法通過 %{protocol} 拉取或推送代碼。"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["在您的個人資料中添加 %{add_ssh_key_link} 之前, 您將無法通過 SSH 拉取或推送代碼。"],"Your name":["您的名字"],"day":["天"],"notification emails":["通知郵件"],"parent":["父級"],"pipeline schedules documentation":["流水線計劃文檔"],"with stage":["於階段"]}}}; \ No newline at end of file diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po index 4b02ba19305..22fe5e4f807 100644 --- a/locale/zh_HK/gitlab.po +++ b/locale/zh_HK/gitlab.po @@ -1,40 +1,240 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gitlab package. -# FIRST AUTHOR , YEAR. # Huang Tao , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-07 21:22+0200\n" +"POT-Creation-Date: 2017-06-12 19:29-0500\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-09 01:09-0400\n" +"PO-Revision-Date: 2017-06-12 11:08-0400\n" "Last-Translator: Huang Tao \n" -"Language-Team: Chinese (Hong Kong) (https://www.transifex.com/gitlab-zh/" -"teams/75177/zh_HK/)\n" +"Language-Team: Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)\n" "Language: zh-HK\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Zanata 3.9.6\n" +msgid "%{commit_author_link} committed %{commit_timeago}" +msgstr "由 %{commit_author_link} 提交於 %{commit_timeago}" + +msgid "About auto deploy" +msgstr "關於自動部署" + +msgid "Active" +msgstr "激活" + +msgid "Activity" +msgstr "活動" + +msgid "Add Changelog" +msgstr "添加變更日誌" + +msgid "Add Contribution guide" +msgstr "添加貢獻指南" + +msgid "Add License" +msgstr "添加許可證" + +msgid "Add an SSH key to your profile to pull or push via SSH." +msgstr "新增壹個用於推送或拉取的 SSH 秘鑰到您的個人賬戶中。" + +msgid "Add new directory" +msgstr "添加新目錄" + +msgid "Archived project! Repository is read-only" +msgstr "歸檔項目!存儲庫為只讀" + msgid "Are you sure you want to delete this pipeline schedule?" msgstr "您確定要刪除此流水線計劃嗎?" +msgid "Attach a file by drag & drop or %{upload_link}" +msgstr "拖放文件到此處或者 %{upload_link}" + +msgid "Branch" +msgid_plural "Branches" +msgstr[0] "分支" + +msgid "" +"Branch %{branch_name} was created. To set up auto deploy, " +"choose a GitLab CI Yaml template and commit your changes. " +"%{link_to_autodeploy_doc}" +msgstr "" +"分支 %{branch_name} 已創建。如要設置自動部署, 請選擇合適的 GitLab CI Yaml " +"模板併提交更改。%{link_to_autodeploy_doc}" + +msgid "Branches" +msgstr "分支" + +msgid "Browse files" +msgstr "瀏覽文件" + msgid "ByAuthor|by" msgstr "作者:" +msgid "CI configuration" +msgstr "CI 配置" + msgid "Cancel" msgstr "取消" +msgid "ChangeTypeActionLabel|Pick into branch" +msgstr "挑選到分支" + +msgid "ChangeTypeActionLabel|Revert in branch" +msgstr "還原分支" + +msgid "ChangeTypeAction|Cherry-pick" +msgstr "優選" + +msgid "ChangeType|commit" +msgstr "提交" + +msgid "ChangeType|merge request" +msgstr "合併請求" + +msgid "Changelog" +msgstr "變更日誌" + +msgid "Charts" +msgstr "統計圖" + +msgid "Cherry-pick this commit" +msgstr "優選此提交" + +msgid "Cherry-pick this merge-request" +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 "Commit" msgid_plural "Commits" msgstr[0] "提交" +msgid "Commit message" +msgstr "提交信息" + +msgid "CommitMessage|Add %{file_name}" +msgstr "添加 %{file_name}" + +msgid "Commits" +msgstr "提交" + +msgid "Commits|History" +msgstr "歷史" + +msgid "Committed by" +msgstr "作者:" + +msgid "Compare" +msgstr "比較" + +msgid "Contribution guide" +msgstr "貢獻指南" + +msgid "Contributors" +msgstr "貢獻者" + +msgid "Copy URL to clipboard" +msgstr "複製URL到剪貼板" + +msgid "Copy commit SHA to clipboard" +msgstr "複製提交 SHA 到剪貼板" + +msgid "Create New Directory" +msgstr "創建新目錄" + +msgid "Create directory" +msgstr "創建目錄" + +msgid "Create empty bare repository" +msgstr "創建空的存儲庫" + +msgid "Create merge request" +msgstr "創建合併請求" + +msgid "Create new..." +msgstr "創建..." + +msgid "CreateNewFork|Fork" +msgstr "派生" + +msgid "CreateTag|Tag" +msgstr "標簽" + msgid "Cron Timezone" msgstr "Cron 時區" +msgid "Cron syntax" +msgstr "Cron 語法" + +msgid "Custom" +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 "" +"自定義通知級別與參與級別相同。使用自定義通知級別,您只能收到所選定事件通知。想瞭解更多信息,請查看 %{notification_link}." + +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." @@ -61,6 +261,9 @@ msgstr "預發布" msgid "CycleAnalyticsStage|Test" msgstr "測試" +msgid "Define a custom pattern with cron syntax" +msgstr "使用 Cron 語法定義自定義模式" + msgid "Delete" msgstr "刪除" @@ -71,20 +274,68 @@ msgstr[0] "部署" msgid "Description" msgstr "描述" +msgid "Directory name" +msgstr "目錄名稱" + +msgid "Don't show again" +msgstr "不再顯示" + +msgid "Download" +msgstr "下載" + +msgid "Download tar" +msgstr "下載 tar" + +msgid "Download tar.bz2" +msgstr "下載 tar.bz2" + +msgid "Download tar.gz" +msgstr "下載 tar.gz" + +msgid "Download zip" +msgstr "下載 zip" + +msgid "DownloadArtifacts|Download" +msgstr "下載" + +msgid "DownloadCommit|Email Patches" +msgstr "電子郵件補丁" + +msgid "DownloadCommit|Plain Diff" +msgstr "Diff 文件" + +msgid "DownloadSource|Download" +msgstr "下載" + msgid "Edit" msgstr "編輯" msgid "Edit Pipeline Schedule %{id}" msgstr "編輯 %{id} 流水線計劃" +msgid "Every day (at 4:00am)" +msgstr "每天(淩晨4點)" + +msgid "Every month (on the 1st at 4:00am)" +msgstr "每月1日(淩晨4點)" + +msgid "Every week (Sundays at 4:00am)" +msgstr "每周日(淩晨4點)" + msgid "Failed to change the owner" msgstr "無法變更所有者" msgid "Failed to remove the pipeline schedule" msgstr "無法刪除流水線計劃" -msgid "Filter" -msgstr "過濾" +msgid "Files" +msgstr "文件" + +msgid "Find by path" +msgstr "按路徑查找" + +msgid "Find file" +msgstr "查找文件" msgid "FirstPushedBy|First" msgstr "首次推送" @@ -92,18 +343,46 @@ msgstr "首次推送" msgid "FirstPushedBy|pushed by" msgstr "推送者:" +msgid "Fork" +msgid_plural "Forks" +msgstr[0] "派生" + +msgid "ForkedFromProjectPath|Forked from" +msgstr "派生自" + msgid "From issue creation until deploy to production" msgstr "從創建議題到部署到生產環境" msgid "From merge request merge until deploy to production" msgstr "從合併請求的合併到部署至生產環境" +msgid "Go to your fork" +msgstr "跳轉到您的派生項目" + +msgid "GoToYourFork|Fork" +msgstr "跳轉到您的派生項目" + +msgid "Home" +msgstr "首頁" + +msgid "Housekeeping successfully started" +msgstr "已開始維護" + +msgid "Import repository" +msgstr "導入存儲庫" + msgid "Interval Pattern" msgstr "間隔模式" msgid "Introducing Cycle Analytics" msgstr "週期分析簡介" +msgid "LFSStatus|Disabled" +msgstr "禁用" + +msgid "LFSStatus|Enabled" +msgstr "啟用" + msgid "Last %d day" msgid_plural "Last %d days" msgstr[0] "最後 %d 天" @@ -111,6 +390,21 @@ msgstr[0] "最後 %d 天" msgid "Last Pipeline" msgstr "最新流水線" +msgid "Last Update" +msgstr "最後更新" + +msgid "Last commit" +msgstr "最後提交" + +msgid "Learn more in the" +msgstr "了解更多" + +msgid "Leave group" +msgstr "離開群組" + +msgid "Leave project" +msgstr "離開項目" + msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" msgstr[0] "最多顯示 %d 個事件" @@ -118,6 +412,9 @@ msgstr[0] "最多顯示 %d 個事件" msgid "Median" msgstr "中位數" +msgid "MissingSSHKeyWarningLink|add an SSH key" +msgstr "添加壹個 SSH 公鑰" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "新議題" @@ -125,6 +422,33 @@ msgstr[0] "新議題" msgid "New Pipeline Schedule" msgstr "創建流水線計劃" +msgid "New branch" +msgstr "新分支" + +msgid "New directory" +msgstr "新增目錄" + +msgid "New file" +msgstr "新增文件" + +msgid "New issue" +msgstr "新議題" + +msgid "New merge request" +msgstr "新合併請求" + +msgid "New schedule" +msgstr "新计划" + +msgid "New snippet" +msgstr "新代碼片段" + +msgid "New tag" +msgstr "新標籤" + +msgid "No repository" +msgstr "沒有存儲庫" + msgid "No schedules" msgstr "沒有計劃" @@ -134,12 +458,75 @@ 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 "OfSearchInADropdown|Filter" +msgstr "篩選" + msgid "OpenedNDaysAgo|Opened" msgstr "開始於" +msgid "Options" +msgstr "選項" + msgid "Owner" msgstr "所有者" +msgid "Pipeline" +msgstr "流水線" + msgid "Pipeline Health" msgstr "流水線健康指標" @@ -176,12 +563,71 @@ msgstr "取得所有權" msgid "PipelineSchedules|Target" msgstr "目標" +msgid "Project '%{project_name}' queued for deletion." +msgstr "項目 '%{project_name}' 已進入刪除隊列。" + +msgid "Project '%{project_name}' was successfully created." +msgstr "項目 '%{project_name}' 已創建完成。" + +msgid "Project '%{project_name}' was successfully updated." +msgstr "項目 '%{project_name}' 已更新完成。" + +msgid "Project '%{project_name}' will be deleted." +msgstr "項目 '%{project_name}' 已刪除。" + +msgid "Project access must be granted explicitly to each user." +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 "Project home" +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 "Read more" msgstr "了解更多" +msgid "Readme" +msgstr "自述文件" + +msgid "RefSwitcher|Branches" +msgstr "分支" + +msgid "RefSwitcher|Tags" +msgstr "標籤" + msgid "Related Commits" msgstr "相關的提交" @@ -200,22 +646,80 @@ msgstr "相關的合併請求" msgid "Related Merged Requests" msgstr "相關已合併的合併請求" +msgid "Remind later" +msgstr "稍後提醒" + +msgid "Remove project" +msgstr "刪除項目" + +msgid "Request Access" +msgstr "申請訪問" + +msgid "Revert this commit" +msgstr "還原此提交" + +msgid "Revert this merge-request" +msgstr "還原此合併請求" + msgid "Save pipeline schedule" msgstr "保存流水線計劃" msgid "Schedule a new pipeline" msgstr "新增流水線計劃" +msgid "Scheduling Pipelines" +msgstr "流水線計劃" + +msgid "Search branches and tags" +msgstr "搜索分支和標籤" + +msgid "Select Archive Format" +msgstr "選擇下載格式" + msgid "Select a timezone" msgstr "選擇時區" msgid "Select target branch" msgstr "選擇目標分支" +msgid "Set a password on your account to pull or push via %{protocol}" +msgstr "為您的賬戶添加壹個用於推送或拉取的 %{protocol} 密碼。" + +msgid "Set up CI" +msgstr "設置 CI" + +msgid "Set up Koding" +msgstr "設置 Koding" + +msgid "Set up auto deploy" +msgstr "設置自動部署" + +msgid "SetPasswordToCloneLink|set a password" +msgstr "設置密碼" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "顯示 %d 個事件" +msgid "Source code" +msgstr "源代碼" + +msgid "StarProject|Star" +msgstr "星標" + +msgid "Start a new merge request with these changes" +msgstr "包含這些更改到 新合併請求" + +msgid "Switch branch/tag" +msgstr "切換分支/標籤" + +msgid "Tag" +msgid_plural "Tags" +msgstr[0] "標籤" + +msgid "Tags" +msgstr "標籤" + msgid "Target Branch" msgstr "目標分支" @@ -228,6 +732,9 @@ 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. " @@ -237,6 +744,12 @@ 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 " @@ -249,6 +762,15 @@ msgid "" "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 " @@ -276,6 +798,11 @@ msgid "" " 6." msgstr "中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。" +msgid "" +"This means you can not push code until you create an empty repository or " +"import existing one." +msgstr "在創建壹個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。" + msgid "Time before an issue gets scheduled" msgstr "議題被列入日程表的時間" @@ -288,6 +815,129 @@ msgstr "從創建合併請求到被合併或關閉的時間" msgid "Time until first merge request" msgstr "創建第壹個合併請求之前的時間" +msgid "Timeago|%s days ago" +msgstr "%s 天前" + +msgid "Timeago|%s days remaining" +msgstr "剩餘 %s 天" + +msgid "Timeago|%s hours remaining" +msgstr "剩餘 %s 小時" + +msgid "Timeago|%s minutes ago" +msgstr "%s 分鐘前" + +msgid "Timeago|%s minutes remaining" +msgstr "剩餘 %s 分鐘" + +msgid "Timeago|%s months ago" +msgstr "%s 個月前" + +msgid "Timeago|%s months remaining" +msgstr "剩餘 %s 月" + +msgid "Timeago|%s seconds remaining" +msgstr "剩餘 %s 秒" + +msgid "Timeago|%s weeks ago" +msgstr "%s 星期前" + +msgid "Timeago|%s weeks remaining" +msgstr "剩餘 %s 星期" + +msgid "Timeago|%s years ago" +msgstr "%s 年前" + +msgid "Timeago|%s years remaining" +msgstr "剩餘 %s 年" + +msgid "Timeago|1 day remaining" +msgstr "剩餘 1 天" + +msgid "Timeago|1 hour remaining" +msgstr "剩餘 1 小時" + +msgid "Timeago|1 minute remaining" +msgstr "剩餘 1 分鐘" + +msgid "Timeago|1 month remaining" +msgstr "剩餘 1 個月" + +msgid "Timeago|1 week remaining" +msgstr "剩餘 1 星期" + +msgid "Timeago|1 year remaining" +msgstr "剩餘 1 年" + +msgid "Timeago|Past due" +msgstr "逾期" + +msgid "Timeago|a day ago" +msgstr "1 天前" + +msgid "Timeago|a month ago" +msgstr "1 個月前" + +msgid "Timeago|a week ago" +msgstr "1 星期前" + +msgid "Timeago|a while" +msgstr "剛剛" + +msgid "Timeago|a year ago" +msgstr "1 年前" + +msgid "Timeago|about %s hours ago" +msgstr "大約 %s 小時前" + +msgid "Timeago|about a minute ago" +msgstr "大約 1 分鐘前" + +msgid "Timeago|about an hour ago" +msgstr "大約 1 小時前" + +msgid "Timeago|in %s days" +msgstr "在 %s 天" + +msgid "Timeago|in %s hours" +msgstr "在 %s 小時" + +msgid "Timeago|in %s minutes" +msgstr "在 %s 分鐘" + +msgid "Timeago|in %s months" +msgstr "在 %s 個月" + +msgid "Timeago|in %s seconds" +msgstr "在 %s 秒" + +msgid "Timeago|in %s weeks" +msgstr "在 %s 星期" + +msgid "Timeago|in %s years" +msgstr "在 %s 年" + +msgid "Timeago|in 1 day" +msgstr "在 1 天" + +msgid "Timeago|in 1 hour" +msgstr "在 1 小時" + +msgid "Timeago|in 1 minute" +msgstr "在 1 分鐘" + +msgid "Timeago|in 1 month" +msgstr "在 1 月" + +msgid "Timeago|in 1 week" +msgstr "在 1 星期" + +msgid "Timeago|in 1 year" +msgstr "在 1 年" + +msgid "Timeago|less than a minute ago" +msgstr "不到 1 分鐘前" + msgid "Time|hr" msgid_plural "Time|hrs" msgstr[0] "小時" @@ -305,16 +955,109 @@ msgstr "總時間" msgid "Total test time for all commits/merges" msgstr "所有提交和合併的總測試時間" +msgid "Unstar" +msgstr "取消星標" + +msgid "Upload New File" +msgstr "上傳新文件" + +msgid "Upload file" +msgstr "上傳文件" + +msgid "Use your global notification setting" +msgstr "使用全局通知設置" + +msgid "VisibilityLevel|Internal" +msgstr "內部" + +msgid "VisibilityLevel|Private" +msgstr "私有" + +msgid "VisibilityLevel|Public" +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 "Withdraw Access Request" +msgstr "取消訪問請求" + +msgid "" +"You are going to remove %{project_name_with_namespace}.\n" +"Removed project CANNOT be restored!\n" +"Are you ABSOLUTELY sure?" +msgstr "您將要刪除 %{project_name_with_namespace}。\n" +"已刪除的項目無法恢復!\n" +"您確定繼續嗎?" + +msgid "" +"You are going to remove the fork relationship to source project " +"%{forked_from_project}. Are you ABSOLUTELY sure?" +msgstr "您將刪除與源項目 %{forked_from_project} 的派生關系。您確定繼續嗎?" + +msgid "" +"You are going to transfer %{project_name_with_namespace} to another owner. " +"Are you ABSOLUTELY sure?" +msgstr "將 %{project_name_with_namespace} 轉義給另壹個所有者。您確定繼續嗎?" + +msgid "You can only add files when you are on a branch" +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 "在您的賬戶上 %{set_password_link} 之前, 您將無法通過 %{protocol} 拉取或推送代碼。" + +msgid "" +"You won't be able to pull or push project code via SSH until you " +"%{add_ssh_key_link} to your profile" +msgstr "在您的個人資料中添加 %{add_ssh_key_link} 之前, 您將無法通過 SSH 拉取或推送代碼。" + +msgid "Your name" +msgstr "您的名字" + msgid "day" msgid_plural "days" msgstr[0] "天" +msgid "notification emails" +msgstr "通知郵件" + +msgid "parent" +msgid_plural "parents" +msgstr[0] "父級" + +msgid "pipeline schedules documentation" +msgstr "流水線計劃文檔" + +msgid "with stage" +msgid_plural "with stages" +msgstr[0] "於階段" + diff --git a/locale/zh_HK/gitlab.po.time_stamp b/locale/zh_HK/gitlab.po.time_stamp index e69de29bb2d..0519ecba6ea 100644 --- a/locale/zh_HK/gitlab.po.time_stamp +++ b/locale/zh_HK/gitlab.po.time_stamp @@ -0,0 +1 @@ + \ No newline at end of file From b89108671b802338d87a3e701665bb4d0185968b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 13 Jun 2017 11:31:37 +0800 Subject: [PATCH 0063/1380] Change the format in changelog --- ...ent_traditional_chinese_in_hong_kong_translation_of_i18n.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml b/changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml index a5eb71b63c6..e383bab23d6 100644 --- a/changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml +++ b/changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml @@ -1,4 +1,4 @@ --- title: Supplement Traditional Chinese in Hong Kong translation of Project Page & Repository Page merge_request: 11995 -author:Huang Tao +author: Huang Tao From fbee7e8fee9c19b8ddc31aa8b23e117ae44a3d15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Thu, 8 Jun 2017 13:06:34 +0800 Subject: [PATCH 0064/1380] supplement traditional chinese in hong kong translation Fix #33442 --- app/assets/javascripts/locale/zh_HK/app.js | 2 +- locale/zh_HK/gitlab.po | 734 ++++++++++++++++++--- locale/zh_HK/gitlab.po.time_stamp | 1 + 3 files changed, 653 insertions(+), 84 deletions(-) diff --git a/app/assets/javascripts/locale/zh_HK/app.js b/app/assets/javascripts/locale/zh_HK/app.js index 30cb1e6b89e..9d4cfeea810 100644 --- a/app/assets/javascripts/locale/zh_HK/app.js +++ b/app/assets/javascripts/locale/zh_HK/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","PO-Revision-Date":"2017-05-04 19:24-0500","Last-Translator":"HuangTao , 2017","Language-Team":"Chinese (Hong Kong) (https://www.transifex.com/gitlab-zh/teams/75177/zh_HK/)","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","Language":"zh_HK","Plural-Forms":"nplurals=1; plural=0;","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"Are you sure you want to delete this pipeline schedule?":[""],"ByAuthor|by":["作者:"],"Cancel":[""],"Commit":["提交"],"Cron Timezone":[""],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Delete":[""],"Deploy":["部署"],"Description":[""],"Edit":[""],"Edit Pipeline Schedule %{id}":[""],"Failed to change the owner":[""],"Failed to remove the pipeline schedule":[""],"Filter":[""],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Interval Pattern":[""],"Introducing Cycle Analytics":["週期分析簡介"],"Last %d day":["最後 %d 天"],"Last Pipeline":[""],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"New Issue":["新議題"],"New Pipeline Schedule":[""],"No schedules":[""],"Not available":["不可用"],"Not enough data":["數據不足"],"OpenedNDaysAgo|Opened":["開始於"],"Owner":[""],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":[""],"Pipeline Schedules":[""],"PipelineSchedules|Activated":[""],"PipelineSchedules|Active":[""],"PipelineSchedules|All":[""],"PipelineSchedules|Inactive":[""],"PipelineSchedules|Next Run":[""],"PipelineSchedules|None":[""],"PipelineSchedules|Provide a short description for this pipeline":[""],"PipelineSchedules|Take ownership":[""],"PipelineSchedules|Target":[""],"ProjectLifecycle|Stage":["項目生命週期"],"Read more":["了解更多"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合並請求"],"Save pipeline schedule":[""],"Schedule a new pipeline":[""],"Select a timezone":[""],"Select target branch":[""],"Showing %d event":["顯示 %d 個事件"],"Target Branch":[""],"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.":["編碼階段概述了從第一次提交到創建合併請求的時間。創建第壹個合並請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建一個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"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.":["評審階段概述了從創建合並請求到合併的時間。當創建第壹個合並請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合並請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了GitLab CI為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是一個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合並或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"You need permission.":["您需要相關的權限。"],"day":["天"]}}}; \ No newline at end of file +var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-07 17:36+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-07 10:18-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"About auto deploy":["關於自動部署"],"Activity":["活動"],"Add Changelog":["添加變更日誌"],"Add Contribution guide":["添加貢獻指南"],"Add License":["添加許可證"],"Add an SSH key to your profile to pull or push via SSH.":["添加一個用於推送或拉取的 SSH 秘鑰到您的個人資料中。"],"Add new directory":["添加新目錄"],"Archived project! Repository is read-only":["歸檔項目!存儲庫是只讀的"],"Branch":["分支"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["分支 %{branch_name} 已創建。如要設置自動部署, 請選擇 GitLab CI Yaml 模板並提交更改。%{link_to_autodeploy_doc}"],"Branches":["分支"],"ByAuthor|by":["作者:"],"CI configuration":["CI 配置"],"Changelog":["變更日誌"],"Charts":["圖表"],"CiStatusLabel|canceled":["已取消"],"CiStatusLabel|created":["已創建"],"CiStatusLabel|failed":["已失敗"],"CiStatusLabel|manual action":["手動操作"],"CiStatusLabel|passed":["已通過"],"CiStatusLabel|passed with warnings":["已通過但有警告"],"CiStatusLabel|pending":["等待中"],"CiStatusLabel|skipped":["已跳過"],"CiStatusLabel|waiting for manual action":["等待手動操作"],"CiStatusText|blocked":["已阻塞"],"CiStatusText|canceled":["已取消"],"CiStatusText|created":["已創建"],"CiStatusText|failed":["已失敗"],"CiStatusText|manual":["待手動"],"CiStatusText|passed":["已通過"],"CiStatusText|pending":["等待中"],"CiStatusText|skipped":["已跳過"],"CiStatus|running":["運行中"],"Commit":["提交"],"CommitMessage|Add %{file_name}":["添加 %{file_name}"],"Commits":["提交"],"Commits|History":["歷史"],"Compare":["比較"],"Contribution guide":["貢獻指南"],"Contributors":["貢獻者"],"Copy URL to clipboard":["複製URL到剪貼板"],"Copy commit SHA to clipboard":["複製提交 SHA 到剪貼板"],"Create New Directory":["創建新目錄"],"Create directory":["創建目錄"],"Create empty bare repository":["創建空的存儲庫"],"Create merge request":["創建合併請求"],"CreateNewFork|Fork":["派生"],"Custom notification events":["自定義通知事件"],"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}.":["自定義通知級別與參與級別相同。使用自定義通知級別,您只能收到所選定事件通知。想瞭解更多信息,請查看 %{notification_link}."],"Cycle Analytics":["週期分析"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Deploy":["部署"],"Directory name":["目錄名稱"],"Don't show again":["不再顯示"],"Download tar":["下載 tar"],"Download tar.bz2":["下載 tar.bz2"],"Download tar.gz":["下載 tar.gz"],"Download zip":["下載 zip"],"DownloadArtifacts|Download":["下載"],"DownloadSource|Download":["下載"],"Files":["文件"],"Find by path":["按路徑查找"],"Find file":["查找文件"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"ForkedFromProjectPath|Forked from":["離開"],"Forks":["派生"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Go to your fork":["跳轉到您的派生項目"],"GoToYourFork|Fork":["跳轉到您的"],"Home":["主頁"],"Housekeeping successfully started":["已開始維護"],"Import repository":["導入存儲庫"],"Introducing Cycle Analytics":["週期分析簡介"],"LFSStatus|Disabled":["禁用"],"LFSStatus|Enabled":["啟用"],"Last %d day":["最後 %d 天"],"Last Update":["最後更新"],"Last commit":["最後提交"],"Leave group":["離開群組"],"Leave project":["離開項目"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"MissingSSHKeyWarningLink|add an SSH key":["添加一個 SSH 公鑰"],"New Issue":["新議題"],"New branch":["新分支"],"New directory":["新目錄"],"New file":["新文件"],"New issue":["新議題"],"New merge request":["新合併請求"],"New snippet":["新代碼片段"],"New tag":["新標籤"],"No repository":["沒有存儲庫"],"Not available":["不可用"],"Not enough data":["數據不足"],"Notification events":["通知事件"],"NotificationEvent|Close issue":["關閉議題"],"NotificationEvent|Close merge request":["關閉合併請求"],"NotificationEvent|Failed pipeline":["流水線失敗"],"NotificationEvent|Merge merge request":["合併請求被合併"],"NotificationEvent|New issue":["新議題"],"NotificationEvent|New merge request":["新合併請求"],"NotificationEvent|New note":["新評論"],"NotificationEvent|Reassign issue":["重新指派議題"],"NotificationEvent|Reassign merge request":["重新指派合併請求"],"NotificationEvent|Reopen issue":["重新打開議題"],"NotificationEvent|Successful pipeline":["流水線成功完成"],"NotificationLevel|Custom":["自定義"],"NotificationLevel|Disabled":["禁用"],"NotificationLevel|Global":["全局"],"NotificationLevel|On mention":["提及"],"NotificationLevel|Participate":["參與"],"NotificationLevel|Watch":["關注"],"OpenedNDaysAgo|Opened":["開始於"],"Pipeline Health":["流水線健康指標"],"Project '%{project_name}' queued for deletion.":["項目 '%{project_name}' 已進入刪除隊列。"],"Project '%{project_name}' was successfully created.":["項目 '%{project_name}' 已創建完成。"],"Project '%{project_name}' was successfully updated.":["項目 '%{project_name}' 已更新完成。"],"Project '%{project_name}' will be deleted.":["項目 '%{project_name}' 已刪除。"],"Project access must be granted explicitly to each user.":["訪問項目必須明確授權給每個用戶。"],"Project export could not be deleted.":["無法刪除項目導出。"],"Project export has been deleted.":["項目導出已刪除。"],"Project export link has expired. Please generate a new export from your project settings.":["項目導出鏈接已過期。請從您的項目設置中生成新的導出。"],"Project export started. A download link will be sent by email.":["項目導出已開始。下載鏈接將通過電子郵件發送。"],"Project home":["項目主頁"],"ProjectFeature|Disabled":["禁用"],"ProjectFeature|Everyone with access":["任何人都可訪問"],"ProjectFeature|Only team members":["只有團隊成員"],"ProjectFileTree|Name":["名稱"],"ProjectLastActivity|Never":["從未"],"ProjectLifecycle|Stage":["項目生命週期"],"ProjectNetworkGraph|Graph":["分支圖"],"Read more":["了解更多"],"Readme":["自述文件"],"RefSwitcher|Branches":["分支"],"RefSwitcher|Tags":["標籤"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合並請求"],"Remind later":["稍後提醒"],"Remove project":["刪除項目"],"Request Access":["申請訪問"],"Search branches and tags":["搜索分支和標籤"],"Select Archive Format":["選擇下載格式"],"Set a password on your account to pull or push via %{protocol}":["為您的賬戶添加壹個用於推送或拉取的 %{protocol} 密碼。"],"Set up CI":["設置 CI"],"Set up Koding":["設置 Koding"],"Set up auto deploy":["設置自動部署"],"SetPasswordToCloneLink|set a password":["設置密碼"],"Showing %d event":["顯示 %d 個事件"],"Source code":["源代碼"],"StarProject|Star":["星標"],"Switch branch/tag":["切換分支/標籤"],"Tag":["標籤"],"Tags":["標籤"],"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.":["編碼階段概述了從第一次提交到創建合併請求的時間。創建第壹個合並請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"The fork relationship has been removed.":["派生關係已被刪除。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建一個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"The project can be accessed by any logged in user.":["該項目允許已登錄的用戶訪問。"],"The project can be accessed without any authentication.":["該項目允許任何人訪問。"],"The repository for this project does not exist.":["此項目的存儲庫不存在。"],"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.":["評審階段概述了從創建合並請求到合併的時間。當創建第壹個合並請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合並請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是一個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"This means you can not push code until you create an empty repository or import existing one.":["在創建一個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合並或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Timeago|%s days ago":["%s 天前"],"Timeago|%s days remaining":["剩餘 %s 天"],"Timeago|%s hours remaining":["剩餘 %s 小時"],"Timeago|%s minutes ago":["%s 分鐘前"],"Timeago|%s minutes remaining":["剩餘 %s 分鐘"],"Timeago|%s months ago":["%s 個月前"],"Timeago|%s months remaining":["剩餘 %s 月"],"Timeago|%s seconds remaining":["剩餘 %s 秒"],"Timeago|%s weeks ago":["%s 星期前"],"Timeago|%s weeks remaining":["剩餘 %s 星期"],"Timeago|%s years ago":["%s 年前"],"Timeago|%s years remaining":["剩餘 %s 年"],"Timeago|1 day remaining":["剩餘 1 天"],"Timeago|1 hour remaining":["剩餘 1 小時"],"Timeago|1 minute remaining":["剩餘 1 分鐘"],"Timeago|1 month remaining":["剩餘 1 個月"],"Timeago|1 week remaining":["剩餘 1 星期"],"Timeago|1 year remaining":["剩餘 1 年"],"Timeago|Past due":["逾期"],"Timeago|a day ago":["1 天前"],"Timeago|a month ago":["1 個月前"],"Timeago|a week ago":["1 星期前"],"Timeago|a while":["剛剛"],"Timeago|a year ago":["1 年前"],"Timeago|about %s hours ago":["大約 %s 小時前"],"Timeago|about a minute ago":["大約 1 分鐘前"],"Timeago|about an hour ago":["大約 1 小時前"],"Timeago|in %s days":["在 %s 天"],"Timeago|in %s hours":["在 %s 小時"],"Timeago|in %s minutes":["在 %s 分鐘"],"Timeago|in %s months":["在 %s 個月"],"Timeago|in %s seconds":["在 %s 秒"],"Timeago|in %s weeks":["在 %s 星期"],"Timeago|in %s years":["在 %s 年"],"Timeago|in 1 day":["在 1 天"],"Timeago|in 1 hour":["在 1 小時"],"Timeago|in 1 minute":["在 1 分鐘"],"Timeago|in 1 month":["在 1 月"],"Timeago|in 1 week":["在 1 星期"],"Timeago|in 1 year":["在 1 年"],"Timeago|less than a minute ago":["不到 1 分鐘前"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Unstar":["取消"],"Upload New File":["上傳新文件"],"Upload file":["上傳文件"],"Use your global notification setting":["使用全局通知設置"],"VisibilityLevel|Internal":["內部"],"VisibilityLevel|Private":["私有"],"VisibilityLevel|Public":["公開"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"Withdraw Access Request":["取消訪問請求"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["您將要刪除 %{project_name_with_namespace}。\\n已刪除的項目無法恢復!\\n妳確定繼續嗎?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["將刪除與源項目 %{forked_from_project} 的派生關係。妳確定繼續嗎?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["將 %{project_name_with_namespace} 轉義給另一個所有者。妳確定繼續嗎?"],"You can only add files when you are on a branch":["您只能在分支上添加文件"],"You must sign in to star a project":["您必須登錄才能對項目加星標"],"You need permission.":["您需要相關的權限。"],"You will not get any notifications via email":["您將不會收到任何通知郵件"],"You will only receive notifications for the events you choose":["您只會收到您選擇的事件通知"],"You will only receive notifications for threads you have participated in":["您只會收到您參與的主題的通知"],"You will receive notifications for any activity":["您將不會收到任何通知"],"You will receive notifications only for comments in which you were @mentioned":["您只会收到評論中提及(@)您的通知"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["在您的賬戶上 %{set_password_link} 之前, 您將無法通過 %{protocol} 拉取或推送代碼。"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["在您的個人資料中添加 %{add_ssh_key_link} 之前, 您將無法通過 SSH 拉取或推送代碼。"],"Your name":["您的名字"],"committed":["提交"],"day":["天"],"notification emails":["通知郵件"]}}}; \ No newline at end of file diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po index 81b2ff863ea..4d8ceac381e 100644 --- a/locale/zh_HK/gitlab.po +++ b/locale/zh_HK/gitlab.po @@ -1,39 +1,183 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gitlab package. -# FIRST AUTHOR , YEAR. -# +# Huang Tao , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2017-05-04 19:24-0500\n" -"Last-Translator: HuangTao , 2017\n" -"Language-Team: Chinese (Hong Kong) (https://www.transifex.com/gitlab-zh/teams/" -"75177/zh_HK/)\n" +"POT-Creation-Date: 2017-06-07 17:36+0200\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_HK\n" +"PO-Revision-Date: 2017-06-07 10:18-0400\n" +"Last-Translator: Huang Tao \n" +"Language-Team: Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)\n" +"Language: zh-HK\n" "Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Zanata 3.9.6\n" -msgid "Are you sure you want to delete this pipeline schedule?" +msgid "About auto deploy" +msgstr "關於自動部署" + +msgid "Activity" +msgstr "活動" + +msgid "Add Changelog" +msgstr "添加變更日誌" + +msgid "Add Contribution guide" +msgstr "添加貢獻指南" + +msgid "Add License" +msgstr "添加許可證" + +msgid "Add an SSH key to your profile to pull or push via SSH." +msgstr "添加一個用於推送或拉取的 SSH 秘鑰到您的個人資料中。" + +msgid "Add new directory" +msgstr "添加新目錄" + +msgid "Archived project! Repository is read-only" +msgstr "歸檔項目!存儲庫是只讀的" + +msgid "Branch" +msgid_plural "Branches" +msgstr[0] "分支" + +msgid "" +"Branch %{branch_name} was created. To set up auto deploy, " +"choose a GitLab CI Yaml template and commit your changes. " +"%{link_to_autodeploy_doc}" msgstr "" +"分支 %{branch_name} 已創建。如要設置自動部署, 請選擇 GitLab CI Yaml " +"模板並提交更改。%{link_to_autodeploy_doc}" + +msgid "Branches" +msgstr "分支" msgid "ByAuthor|by" msgstr "作者:" -msgid "Cancel" -msgstr "" +msgid "CI configuration" +msgstr "CI 配置" + +msgid "Changelog" +msgstr "變更日誌" + +msgid "Charts" +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 "Commit" msgid_plural "Commits" msgstr[0] "提交" -msgid "Cron Timezone" -msgstr "" +msgid "CommitMessage|Add %{file_name}" +msgstr "添加 %{file_name}" -msgid "Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project." +msgid "Commits" +msgstr "提交" + +msgid "Commits|History" +msgstr "歷史" + +msgid "Compare" +msgstr "比較" + +msgid "Contribution guide" +msgstr "貢獻指南" + +msgid "Contributors" +msgstr "貢獻者" + +msgid "Copy URL to clipboard" +msgstr "複製URL到剪貼板" + +msgid "Copy commit SHA to clipboard" +msgstr "複製提交 SHA 到剪貼板" + +msgid "Create New Directory" +msgstr "創建新目錄" + +msgid "Create directory" +msgstr "創建目錄" + +msgid "Create empty bare repository" +msgstr "創建空的存儲庫" + +msgid "Create merge request" +msgstr "創建合併請求" + +msgid "CreateNewFork|Fork" +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 "" +"自定義通知級別與參與級別相同。使用自定義通知級別,您只能收到所選定事件通知。想瞭解更多信息,請查看 %{notification_link}." + +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" @@ -57,30 +201,42 @@ msgstr "預發布" msgid "CycleAnalyticsStage|Test" msgstr "測試" -msgid "Delete" -msgstr "" - msgid "Deploy" msgid_plural "Deploys" msgstr[0] "部署" -msgid "Description" -msgstr "" +msgid "Directory name" +msgstr "目錄名稱" -msgid "Edit" -msgstr "" +msgid "Don't show again" +msgstr "不再顯示" -msgid "Edit Pipeline Schedule %{id}" -msgstr "" +msgid "Download tar" +msgstr "下載 tar" -msgid "Failed to change the owner" -msgstr "" +msgid "Download tar.bz2" +msgstr "下載 tar.bz2" -msgid "Failed to remove the pipeline schedule" -msgstr "" +msgid "Download tar.gz" +msgstr "下載 tar.gz" -msgid "Filter" -msgstr "" +msgid "Download zip" +msgstr "下載 zip" + +msgid "DownloadArtifacts|Download" +msgstr "下載" + +msgid "DownloadSource|Download" +msgstr "下載" + +msgid "Files" +msgstr "文件" + +msgid "Find by path" +msgstr "按路徑查找" + +msgid "Find file" +msgstr "查找文件" msgid "FirstPushedBy|First" msgstr "首次推送" @@ -88,24 +244,57 @@ msgstr "首次推送" msgid "FirstPushedBy|pushed by" msgstr "推送者:" +msgid "ForkedFromProjectPath|Forked from" +msgstr "離開" + +msgid "Forks" +msgstr "派生" + msgid "From issue creation until deploy to production" msgstr "從創建議題到部署到生產環境" msgid "From merge request merge until deploy to production" msgstr "從合併請求的合併到部署至生產環境" -msgid "Interval Pattern" -msgstr "" +msgid "Go to your fork" +msgstr "跳轉到您的派生項目" + +msgid "GoToYourFork|Fork" +msgstr "跳轉到您的" + +msgid "Home" +msgstr "主頁" + +msgid "Housekeeping successfully started" +msgstr "已開始維護" + +msgid "Import repository" +msgstr "導入存儲庫" msgid "Introducing Cycle Analytics" msgstr "週期分析簡介" +msgid "LFSStatus|Disabled" +msgstr "禁用" + +msgid "LFSStatus|Enabled" +msgstr "啟用" + msgid "Last %d day" msgid_plural "Last %d days" msgstr[0] "最後 %d 天" -msgid "Last Pipeline" -msgstr "" +msgid "Last Update" +msgstr "最後更新" + +msgid "Last commit" +msgstr "最後提交" + +msgid "Leave group" +msgstr "離開群組" + +msgid "Leave project" +msgstr "離開項目" msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" @@ -114,15 +303,36 @@ msgstr[0] "最多顯示 %d 個事件" msgid "Median" msgstr "中位數" +msgid "MissingSSHKeyWarningLink|add an SSH key" +msgstr "添加一個 SSH 公鑰" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "新議題" -msgid "New Pipeline Schedule" -msgstr "" +msgid "New branch" +msgstr "新分支" -msgid "No schedules" -msgstr "" +msgid "New directory" +msgstr "新目錄" + +msgid "New file" +msgstr "新文件" + +msgid "New issue" +msgstr "新議題" + +msgid "New merge request" +msgstr "新合併請求" + +msgid "New snippet" +msgstr "新代碼片段" + +msgid "New tag" +msgstr "新標籤" + +msgid "No repository" +msgstr "沒有存儲庫" msgid "Not available" msgstr "不可用" @@ -130,54 +340,131 @@ 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 "OpenedNDaysAgo|Opened" msgstr "開始於" -msgid "Owner" -msgstr "" - msgid "Pipeline Health" msgstr "流水線健康指標" -msgid "Pipeline Schedule" -msgstr "" +msgid "Project '%{project_name}' queued for deletion." +msgstr "項目 '%{project_name}' 已進入刪除隊列。" -msgid "Pipeline Schedules" -msgstr "" +msgid "Project '%{project_name}' was successfully created." +msgstr "項目 '%{project_name}' 已創建完成。" -msgid "PipelineSchedules|Activated" -msgstr "" +msgid "Project '%{project_name}' was successfully updated." +msgstr "項目 '%{project_name}' 已更新完成。" -msgid "PipelineSchedules|Active" -msgstr "" +msgid "Project '%{project_name}' will be deleted." +msgstr "項目 '%{project_name}' 已刪除。" -msgid "PipelineSchedules|All" -msgstr "" +msgid "Project access must be granted explicitly to each user." +msgstr "訪問項目必須明確授權給每個用戶。" -msgid "PipelineSchedules|Inactive" -msgstr "" +msgid "Project export could not be deleted." +msgstr "無法刪除項目導出。" -msgid "PipelineSchedules|Next Run" -msgstr "" +msgid "Project export has been deleted." +msgstr "項目導出已刪除。" -msgid "PipelineSchedules|None" -msgstr "" +msgid "" +"Project export link has expired. Please generate a new export from your " +"project settings." +msgstr "項目導出鏈接已過期。請從您的項目設置中生成新的導出。" -msgid "PipelineSchedules|Provide a short description for this pipeline" -msgstr "" +msgid "Project export started. A download link will be sent by email." +msgstr "項目導出已開始。下載鏈接將通過電子郵件發送。" -msgid "PipelineSchedules|Take ownership" -msgstr "" +msgid "Project home" +msgstr "項目主頁" -msgid "PipelineSchedules|Target" -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 "Read more" msgstr "了解更多" +msgid "Readme" +msgstr "自述文件" + +msgid "RefSwitcher|Branches" +msgstr "分支" + +msgid "RefSwitcher|Tags" +msgstr "標籤" + msgid "Related Commits" msgstr "相關的提交" @@ -196,58 +483,130 @@ msgstr "相關的合併請求" msgid "Related Merged Requests" msgstr "相關已合併的合並請求" -msgid "Save pipeline schedule" -msgstr "" +msgid "Remind later" +msgstr "稍後提醒" -msgid "Schedule a new pipeline" -msgstr "" +msgid "Remove project" +msgstr "刪除項目" -msgid "Select a timezone" -msgstr "" +msgid "Request Access" +msgstr "申請訪問" -msgid "Select target branch" -msgstr "" +msgid "Search branches and tags" +msgstr "搜索分支和標籤" + +msgid "Select Archive Format" +msgstr "選擇下載格式" + +msgid "Set a password on your account to pull or push via %{protocol}" +msgstr "為您的賬戶添加壹個用於推送或拉取的 %{protocol} 密碼。" + +msgid "Set up CI" +msgstr "設置 CI" + +msgid "Set up Koding" +msgstr "設置 Koding" + +msgid "Set up auto deploy" +msgstr "設置自動部署" + +msgid "SetPasswordToCloneLink|set a password" +msgstr "設置密碼" msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "顯示 %d 個事件" -msgid "Target Branch" -msgstr "" +msgid "Source code" +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 "StarProject|Star" +msgstr "星標" + +msgid "Switch branch/tag" +msgstr "切換分支/標籤" + +msgid "Tag" +msgid_plural "Tags" +msgstr[0] "標籤" + +msgid "Tags" +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 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." +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 phase of the development lifecycle." 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 "計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。" -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 "生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。" -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." +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." +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 "測試階段概述了GitLab CI為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。" +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 "測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。" 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." +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 "中位數是一個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。" +msgid "" +"This means you can not push code until you create an empty repository or " +"import existing one." +msgstr "在創建一個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。" + msgid "Time before an issue gets scheduled" msgstr "議題被列入日程表的時間" @@ -260,6 +619,129 @@ msgstr "從創建合併請求到被合並或關閉的時間" msgid "Time until first merge request" msgstr "創建第壹個合併請求之前的時間" +msgid "Timeago|%s days ago" +msgstr "%s 天前" + +msgid "Timeago|%s days remaining" +msgstr "剩餘 %s 天" + +msgid "Timeago|%s hours remaining" +msgstr "剩餘 %s 小時" + +msgid "Timeago|%s minutes ago" +msgstr "%s 分鐘前" + +msgid "Timeago|%s minutes remaining" +msgstr "剩餘 %s 分鐘" + +msgid "Timeago|%s months ago" +msgstr "%s 個月前" + +msgid "Timeago|%s months remaining" +msgstr "剩餘 %s 月" + +msgid "Timeago|%s seconds remaining" +msgstr "剩餘 %s 秒" + +msgid "Timeago|%s weeks ago" +msgstr "%s 星期前" + +msgid "Timeago|%s weeks remaining" +msgstr "剩餘 %s 星期" + +msgid "Timeago|%s years ago" +msgstr "%s 年前" + +msgid "Timeago|%s years remaining" +msgstr "剩餘 %s 年" + +msgid "Timeago|1 day remaining" +msgstr "剩餘 1 天" + +msgid "Timeago|1 hour remaining" +msgstr "剩餘 1 小時" + +msgid "Timeago|1 minute remaining" +msgstr "剩餘 1 分鐘" + +msgid "Timeago|1 month remaining" +msgstr "剩餘 1 個月" + +msgid "Timeago|1 week remaining" +msgstr "剩餘 1 星期" + +msgid "Timeago|1 year remaining" +msgstr "剩餘 1 年" + +msgid "Timeago|Past due" +msgstr "逾期" + +msgid "Timeago|a day ago" +msgstr "1 天前" + +msgid "Timeago|a month ago" +msgstr "1 個月前" + +msgid "Timeago|a week ago" +msgstr "1 星期前" + +msgid "Timeago|a while" +msgstr "剛剛" + +msgid "Timeago|a year ago" +msgstr "1 年前" + +msgid "Timeago|about %s hours ago" +msgstr "大約 %s 小時前" + +msgid "Timeago|about a minute ago" +msgstr "大約 1 分鐘前" + +msgid "Timeago|about an hour ago" +msgstr "大約 1 小時前" + +msgid "Timeago|in %s days" +msgstr "在 %s 天" + +msgid "Timeago|in %s hours" +msgstr "在 %s 小時" + +msgid "Timeago|in %s minutes" +msgstr "在 %s 分鐘" + +msgid "Timeago|in %s months" +msgstr "在 %s 個月" + +msgid "Timeago|in %s seconds" +msgstr "在 %s 秒" + +msgid "Timeago|in %s weeks" +msgstr "在 %s 星期" + +msgid "Timeago|in %s years" +msgstr "在 %s 年" + +msgid "Timeago|in 1 day" +msgstr "在 1 天" + +msgid "Timeago|in 1 hour" +msgstr "在 1 小時" + +msgid "Timeago|in 1 minute" +msgstr "在 1 分鐘" + +msgid "Timeago|in 1 month" +msgstr "在 1 月" + +msgid "Timeago|in 1 week" +msgstr "在 1 星期" + +msgid "Timeago|in 1 year" +msgstr "在 1 年" + +msgid "Timeago|less than a minute ago" +msgstr "不到 1 分鐘前" + msgid "Time|hr" msgid_plural "Time|hrs" msgstr[0] "小時" @@ -277,15 +759,101 @@ msgstr "總時間" msgid "Total test time for all commits/merges" msgstr "所有提交和合併的總測試時間" +msgid "Unstar" +msgstr "取消" + +msgid "Upload New File" +msgstr "上傳新文件" + +msgid "Upload file" +msgstr "上傳文件" + +msgid "Use your global notification setting" +msgstr "使用全局通知設置" + +msgid "VisibilityLevel|Internal" +msgstr "內部" + +msgid "VisibilityLevel|Private" +msgstr "私有" + +msgid "VisibilityLevel|Public" +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 "Withdraw Access Request" +msgstr "取消訪問請求" + +msgid "" +"You are going to remove %{project_name_with_namespace}.\n" +"Removed project CANNOT be restored!\n" +"Are you ABSOLUTELY sure?" +msgstr "您將要刪除 %{project_name_with_namespace}。\n" +"已刪除的項目無法恢復!\n" +"妳確定繼續嗎?" + +msgid "" +"You are going to remove the fork relationship to source project " +"%{forked_from_project}. Are you ABSOLUTELY sure?" +msgstr "將刪除與源項目 %{forked_from_project} 的派生關係。妳確定繼續嗎?" + +msgid "" +"You are going to transfer %{project_name_with_namespace} to another owner. " +"Are you ABSOLUTELY sure?" +msgstr "將 %{project_name_with_namespace} 轉義給另一個所有者。妳確定繼續嗎?" + +msgid "You can only add files when you are on a branch" +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 "在您的賬戶上 %{set_password_link} 之前, 您將無法通過 %{protocol} 拉取或推送代碼。" + +msgid "" +"You won't be able to pull or push project code via SSH until you " +"%{add_ssh_key_link} to your profile" +msgstr "在您的個人資料中添加 %{add_ssh_key_link} 之前, 您將無法通過 SSH 拉取或推送代碼。" + +msgid "Your name" +msgstr "您的名字" + +msgid "committed" +msgstr "提交" + msgid "day" msgid_plural "days" msgstr[0] "天" + +msgid "notification emails" +msgstr "通知郵件" + diff --git a/locale/zh_HK/gitlab.po.time_stamp b/locale/zh_HK/gitlab.po.time_stamp index e69de29bb2d..0519ecba6ea 100644 --- a/locale/zh_HK/gitlab.po.time_stamp +++ b/locale/zh_HK/gitlab.po.time_stamp @@ -0,0 +1 @@ + \ No newline at end of file From a755d7197fdb459b5d37b0b40de1723b0726fea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Thu, 8 Jun 2017 13:21:02 +0800 Subject: [PATCH 0065/1380] add changelog of supplement traditional chinese in hong kong translation --- ...t_traditional_chinese_in_hong_kong_translation_of_i18n.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml diff --git a/changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml b/changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml new file mode 100644 index 00000000000..a5eb71b63c6 --- /dev/null +++ b/changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml @@ -0,0 +1,4 @@ +--- +title: Supplement Traditional Chinese in Hong Kong translation of Project Page & Repository Page +merge_request: 11995 +author:Huang Tao From 310be19fcfa2eed10665bbfd77ba38510f5caf64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Mon, 12 Jun 2017 09:55:50 +0800 Subject: [PATCH 0066/1380] optimize translation based on comments --- app/assets/javascripts/locale/zh_HK/app.js | 2 +- locale/zh_HK/gitlab.po | 699 +++------------------ locale/zh_HK/gitlab.po.time_stamp | 1 - 3 files changed, 81 insertions(+), 621 deletions(-) diff --git a/app/assets/javascripts/locale/zh_HK/app.js b/app/assets/javascripts/locale/zh_HK/app.js index 9d4cfeea810..fcd5795c8bb 100644 --- a/app/assets/javascripts/locale/zh_HK/app.js +++ b/app/assets/javascripts/locale/zh_HK/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-07 17:36+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-07 10:18-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"About auto deploy":["關於自動部署"],"Activity":["活動"],"Add Changelog":["添加變更日誌"],"Add Contribution guide":["添加貢獻指南"],"Add License":["添加許可證"],"Add an SSH key to your profile to pull or push via SSH.":["添加一個用於推送或拉取的 SSH 秘鑰到您的個人資料中。"],"Add new directory":["添加新目錄"],"Archived project! Repository is read-only":["歸檔項目!存儲庫是只讀的"],"Branch":["分支"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["分支 %{branch_name} 已創建。如要設置自動部署, 請選擇 GitLab CI Yaml 模板並提交更改。%{link_to_autodeploy_doc}"],"Branches":["分支"],"ByAuthor|by":["作者:"],"CI configuration":["CI 配置"],"Changelog":["變更日誌"],"Charts":["圖表"],"CiStatusLabel|canceled":["已取消"],"CiStatusLabel|created":["已創建"],"CiStatusLabel|failed":["已失敗"],"CiStatusLabel|manual action":["手動操作"],"CiStatusLabel|passed":["已通過"],"CiStatusLabel|passed with warnings":["已通過但有警告"],"CiStatusLabel|pending":["等待中"],"CiStatusLabel|skipped":["已跳過"],"CiStatusLabel|waiting for manual action":["等待手動操作"],"CiStatusText|blocked":["已阻塞"],"CiStatusText|canceled":["已取消"],"CiStatusText|created":["已創建"],"CiStatusText|failed":["已失敗"],"CiStatusText|manual":["待手動"],"CiStatusText|passed":["已通過"],"CiStatusText|pending":["等待中"],"CiStatusText|skipped":["已跳過"],"CiStatus|running":["運行中"],"Commit":["提交"],"CommitMessage|Add %{file_name}":["添加 %{file_name}"],"Commits":["提交"],"Commits|History":["歷史"],"Compare":["比較"],"Contribution guide":["貢獻指南"],"Contributors":["貢獻者"],"Copy URL to clipboard":["複製URL到剪貼板"],"Copy commit SHA to clipboard":["複製提交 SHA 到剪貼板"],"Create New Directory":["創建新目錄"],"Create directory":["創建目錄"],"Create empty bare repository":["創建空的存儲庫"],"Create merge request":["創建合併請求"],"CreateNewFork|Fork":["派生"],"Custom notification events":["自定義通知事件"],"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}.":["自定義通知級別與參與級別相同。使用自定義通知級別,您只能收到所選定事件通知。想瞭解更多信息,請查看 %{notification_link}."],"Cycle Analytics":["週期分析"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Deploy":["部署"],"Directory name":["目錄名稱"],"Don't show again":["不再顯示"],"Download tar":["下載 tar"],"Download tar.bz2":["下載 tar.bz2"],"Download tar.gz":["下載 tar.gz"],"Download zip":["下載 zip"],"DownloadArtifacts|Download":["下載"],"DownloadSource|Download":["下載"],"Files":["文件"],"Find by path":["按路徑查找"],"Find file":["查找文件"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"ForkedFromProjectPath|Forked from":["離開"],"Forks":["派生"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Go to your fork":["跳轉到您的派生項目"],"GoToYourFork|Fork":["跳轉到您的"],"Home":["主頁"],"Housekeeping successfully started":["已開始維護"],"Import repository":["導入存儲庫"],"Introducing Cycle Analytics":["週期分析簡介"],"LFSStatus|Disabled":["禁用"],"LFSStatus|Enabled":["啟用"],"Last %d day":["最後 %d 天"],"Last Update":["最後更新"],"Last commit":["最後提交"],"Leave group":["離開群組"],"Leave project":["離開項目"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"MissingSSHKeyWarningLink|add an SSH key":["添加一個 SSH 公鑰"],"New Issue":["新議題"],"New branch":["新分支"],"New directory":["新目錄"],"New file":["新文件"],"New issue":["新議題"],"New merge request":["新合併請求"],"New snippet":["新代碼片段"],"New tag":["新標籤"],"No repository":["沒有存儲庫"],"Not available":["不可用"],"Not enough data":["數據不足"],"Notification events":["通知事件"],"NotificationEvent|Close issue":["關閉議題"],"NotificationEvent|Close merge request":["關閉合併請求"],"NotificationEvent|Failed pipeline":["流水線失敗"],"NotificationEvent|Merge merge request":["合併請求被合併"],"NotificationEvent|New issue":["新議題"],"NotificationEvent|New merge request":["新合併請求"],"NotificationEvent|New note":["新評論"],"NotificationEvent|Reassign issue":["重新指派議題"],"NotificationEvent|Reassign merge request":["重新指派合併請求"],"NotificationEvent|Reopen issue":["重新打開議題"],"NotificationEvent|Successful pipeline":["流水線成功完成"],"NotificationLevel|Custom":["自定義"],"NotificationLevel|Disabled":["禁用"],"NotificationLevel|Global":["全局"],"NotificationLevel|On mention":["提及"],"NotificationLevel|Participate":["參與"],"NotificationLevel|Watch":["關注"],"OpenedNDaysAgo|Opened":["開始於"],"Pipeline Health":["流水線健康指標"],"Project '%{project_name}' queued for deletion.":["項目 '%{project_name}' 已進入刪除隊列。"],"Project '%{project_name}' was successfully created.":["項目 '%{project_name}' 已創建完成。"],"Project '%{project_name}' was successfully updated.":["項目 '%{project_name}' 已更新完成。"],"Project '%{project_name}' will be deleted.":["項目 '%{project_name}' 已刪除。"],"Project access must be granted explicitly to each user.":["訪問項目必須明確授權給每個用戶。"],"Project export could not be deleted.":["無法刪除項目導出。"],"Project export has been deleted.":["項目導出已刪除。"],"Project export link has expired. Please generate a new export from your project settings.":["項目導出鏈接已過期。請從您的項目設置中生成新的導出。"],"Project export started. A download link will be sent by email.":["項目導出已開始。下載鏈接將通過電子郵件發送。"],"Project home":["項目主頁"],"ProjectFeature|Disabled":["禁用"],"ProjectFeature|Everyone with access":["任何人都可訪問"],"ProjectFeature|Only team members":["只有團隊成員"],"ProjectFileTree|Name":["名稱"],"ProjectLastActivity|Never":["從未"],"ProjectLifecycle|Stage":["項目生命週期"],"ProjectNetworkGraph|Graph":["分支圖"],"Read more":["了解更多"],"Readme":["自述文件"],"RefSwitcher|Branches":["分支"],"RefSwitcher|Tags":["標籤"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合並請求"],"Remind later":["稍後提醒"],"Remove project":["刪除項目"],"Request Access":["申請訪問"],"Search branches and tags":["搜索分支和標籤"],"Select Archive Format":["選擇下載格式"],"Set a password on your account to pull or push via %{protocol}":["為您的賬戶添加壹個用於推送或拉取的 %{protocol} 密碼。"],"Set up CI":["設置 CI"],"Set up Koding":["設置 Koding"],"Set up auto deploy":["設置自動部署"],"SetPasswordToCloneLink|set a password":["設置密碼"],"Showing %d event":["顯示 %d 個事件"],"Source code":["源代碼"],"StarProject|Star":["星標"],"Switch branch/tag":["切換分支/標籤"],"Tag":["標籤"],"Tags":["標籤"],"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.":["編碼階段概述了從第一次提交到創建合併請求的時間。創建第壹個合並請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"The fork relationship has been removed.":["派生關係已被刪除。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建一個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"The project can be accessed by any logged in user.":["該項目允許已登錄的用戶訪問。"],"The project can be accessed without any authentication.":["該項目允許任何人訪問。"],"The repository for this project does not exist.":["此項目的存儲庫不存在。"],"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.":["評審階段概述了從創建合並請求到合併的時間。當創建第壹個合並請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合並請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是一個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"This means you can not push code until you create an empty repository or import existing one.":["在創建一個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合並或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Timeago|%s days ago":["%s 天前"],"Timeago|%s days remaining":["剩餘 %s 天"],"Timeago|%s hours remaining":["剩餘 %s 小時"],"Timeago|%s minutes ago":["%s 分鐘前"],"Timeago|%s minutes remaining":["剩餘 %s 分鐘"],"Timeago|%s months ago":["%s 個月前"],"Timeago|%s months remaining":["剩餘 %s 月"],"Timeago|%s seconds remaining":["剩餘 %s 秒"],"Timeago|%s weeks ago":["%s 星期前"],"Timeago|%s weeks remaining":["剩餘 %s 星期"],"Timeago|%s years ago":["%s 年前"],"Timeago|%s years remaining":["剩餘 %s 年"],"Timeago|1 day remaining":["剩餘 1 天"],"Timeago|1 hour remaining":["剩餘 1 小時"],"Timeago|1 minute remaining":["剩餘 1 分鐘"],"Timeago|1 month remaining":["剩餘 1 個月"],"Timeago|1 week remaining":["剩餘 1 星期"],"Timeago|1 year remaining":["剩餘 1 年"],"Timeago|Past due":["逾期"],"Timeago|a day ago":["1 天前"],"Timeago|a month ago":["1 個月前"],"Timeago|a week ago":["1 星期前"],"Timeago|a while":["剛剛"],"Timeago|a year ago":["1 年前"],"Timeago|about %s hours ago":["大約 %s 小時前"],"Timeago|about a minute ago":["大約 1 分鐘前"],"Timeago|about an hour ago":["大約 1 小時前"],"Timeago|in %s days":["在 %s 天"],"Timeago|in %s hours":["在 %s 小時"],"Timeago|in %s minutes":["在 %s 分鐘"],"Timeago|in %s months":["在 %s 個月"],"Timeago|in %s seconds":["在 %s 秒"],"Timeago|in %s weeks":["在 %s 星期"],"Timeago|in %s years":["在 %s 年"],"Timeago|in 1 day":["在 1 天"],"Timeago|in 1 hour":["在 1 小時"],"Timeago|in 1 minute":["在 1 分鐘"],"Timeago|in 1 month":["在 1 月"],"Timeago|in 1 week":["在 1 星期"],"Timeago|in 1 year":["在 1 年"],"Timeago|less than a minute ago":["不到 1 分鐘前"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Unstar":["取消"],"Upload New File":["上傳新文件"],"Upload file":["上傳文件"],"Use your global notification setting":["使用全局通知設置"],"VisibilityLevel|Internal":["內部"],"VisibilityLevel|Private":["私有"],"VisibilityLevel|Public":["公開"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"Withdraw Access Request":["取消訪問請求"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["您將要刪除 %{project_name_with_namespace}。\\n已刪除的項目無法恢復!\\n妳確定繼續嗎?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["將刪除與源項目 %{forked_from_project} 的派生關係。妳確定繼續嗎?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["將 %{project_name_with_namespace} 轉義給另一個所有者。妳確定繼續嗎?"],"You can only add files when you are on a branch":["您只能在分支上添加文件"],"You must sign in to star a project":["您必須登錄才能對項目加星標"],"You need permission.":["您需要相關的權限。"],"You will not get any notifications via email":["您將不會收到任何通知郵件"],"You will only receive notifications for the events you choose":["您只會收到您選擇的事件通知"],"You will only receive notifications for threads you have participated in":["您只會收到您參與的主題的通知"],"You will receive notifications for any activity":["您將不會收到任何通知"],"You will receive notifications only for comments in which you were @mentioned":["您只会收到評論中提及(@)您的通知"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["在您的賬戶上 %{set_password_link} 之前, 您將無法通過 %{protocol} 拉取或推送代碼。"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["在您的個人資料中添加 %{add_ssh_key_link} 之前, 您將無法通過 SSH 拉取或推送代碼。"],"Your name":["您的名字"],"committed":["提交"],"day":["天"],"notification emails":["通知郵件"]}}}; \ No newline at end of file +var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-07 21:22+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-09 01:09-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://www.transifex.com/gitlab-zh/teams/75177/zh_HK/)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"Are you sure you want to delete this pipeline schedule?":["您確定要刪除此流水線計劃嗎?"],"ByAuthor|by":["作者:"],"Cancel":["取消"],"Commit":["提交"],"Cron Timezone":["Cron 時區"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Delete":["刪除"],"Deploy":["部署"],"Description":["描述"],"Edit":["編輯"],"Edit Pipeline Schedule %{id}":["編輯 %{id} 流水線計劃"],"Failed to change the owner":["無法變更所有者"],"Failed to remove the pipeline schedule":["無法刪除流水線計劃"],"Filter":["過濾"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Interval Pattern":["間隔模式"],"Introducing Cycle Analytics":["週期分析簡介"],"Last %d day":["最後 %d 天"],"Last Pipeline":["最新流水線"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"New Issue":["新議題"],"New Pipeline Schedule":["創建流水線計劃"],"No schedules":["沒有計劃"],"Not available":["不可用"],"Not enough data":["數據不足"],"OpenedNDaysAgo|Opened":["開始於"],"Owner":["所有者"],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":["流水線計劃"],"Pipeline Schedules":["流水線計劃"],"PipelineSchedules|Activated":["已激活"],"PipelineSchedules|Active":["激活"],"PipelineSchedules|All":["所有"],"PipelineSchedules|Inactive":["等待"],"PipelineSchedules|Next Run":["下壹個運行"],"PipelineSchedules|None":["無"],"PipelineSchedules|Provide a short description for this pipeline":["為此流水線提供簡短描述"],"PipelineSchedules|Take ownership":["取得所有權"],"PipelineSchedules|Target":["目標"],"ProjectLifecycle|Stage":["階段"],"Read more":["了解更多"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合併請求"],"Save pipeline schedule":["保存流水線計劃"],"Schedule a new pipeline":["新增流水線計劃"],"Select a timezone":["選擇時區"],"Select target branch":["選擇目標分支"],"Showing %d event":["顯示 %d 個事件"],"Target Branch":["目標分支"],"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.":["編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建壹個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"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.":["評審階段概述了從創建合併請求到合併的時間。當創建第壹個合併請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合併或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"You need permission.":["您需要相關的權限。"],"day":["天"]}}}; \ No newline at end of file diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po index 4d8ceac381e..4b02ba19305 100644 --- a/locale/zh_HK/gitlab.po +++ b/locale/zh_HK/gitlab.po @@ -1,179 +1,39 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the gitlab package. +# FIRST AUTHOR , YEAR. # Huang Tao , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-07 17:36+0200\n" +"POT-Creation-Date: 2017-06-07 21:22+0200\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-07 10:18-0400\n" +"PO-Revision-Date: 2017-06-09 01:09-0400\n" "Last-Translator: Huang Tao \n" -"Language-Team: Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)\n" +"Language-Team: Chinese (Hong Kong) (https://www.transifex.com/gitlab-zh/" +"teams/75177/zh_HK/)\n" "Language: zh-HK\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Zanata 3.9.6\n" -msgid "About auto deploy" -msgstr "關於自動部署" - -msgid "Activity" -msgstr "活動" - -msgid "Add Changelog" -msgstr "添加變更日誌" - -msgid "Add Contribution guide" -msgstr "添加貢獻指南" - -msgid "Add License" -msgstr "添加許可證" - -msgid "Add an SSH key to your profile to pull or push via SSH." -msgstr "添加一個用於推送或拉取的 SSH 秘鑰到您的個人資料中。" - -msgid "Add new directory" -msgstr "添加新目錄" - -msgid "Archived project! Repository is read-only" -msgstr "歸檔項目!存儲庫是只讀的" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "分支" - -msgid "" -"Branch %{branch_name} was created. To set up auto deploy, " -"choose a GitLab CI Yaml template and commit your changes. " -"%{link_to_autodeploy_doc}" -msgstr "" -"分支 %{branch_name} 已創建。如要設置自動部署, 請選擇 GitLab CI Yaml " -"模板並提交更改。%{link_to_autodeploy_doc}" - -msgid "Branches" -msgstr "分支" +msgid "Are you sure you want to delete this pipeline schedule?" +msgstr "您確定要刪除此流水線計劃嗎?" msgid "ByAuthor|by" msgstr "作者:" -msgid "CI configuration" -msgstr "CI 配置" - -msgid "Changelog" -msgstr "變更日誌" - -msgid "Charts" -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 "Cancel" +msgstr "取消" msgid "Commit" msgid_plural "Commits" msgstr[0] "提交" -msgid "CommitMessage|Add %{file_name}" -msgstr "添加 %{file_name}" - -msgid "Commits" -msgstr "提交" - -msgid "Commits|History" -msgstr "歷史" - -msgid "Compare" -msgstr "比較" - -msgid "Contribution guide" -msgstr "貢獻指南" - -msgid "Contributors" -msgstr "貢獻者" - -msgid "Copy URL to clipboard" -msgstr "複製URL到剪貼板" - -msgid "Copy commit SHA to clipboard" -msgstr "複製提交 SHA 到剪貼板" - -msgid "Create New Directory" -msgstr "創建新目錄" - -msgid "Create directory" -msgstr "創建目錄" - -msgid "Create empty bare repository" -msgstr "創建空的存儲庫" - -msgid "Create merge request" -msgstr "創建合併請求" - -msgid "CreateNewFork|Fork" -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 "" -"自定義通知級別與參與級別相同。使用自定義通知級別,您只能收到所選定事件通知。想瞭解更多信息,請查看 %{notification_link}." - -msgid "Cycle Analytics" -msgstr "週期分析" +msgid "Cron Timezone" +msgstr "Cron 時區" msgid "" "Cycle Analytics gives an overview of how much time it takes to go from idea " @@ -201,42 +61,30 @@ msgstr "預發布" msgid "CycleAnalyticsStage|Test" msgstr "測試" +msgid "Delete" +msgstr "刪除" + msgid "Deploy" msgid_plural "Deploys" msgstr[0] "部署" -msgid "Directory name" -msgstr "目錄名稱" +msgid "Description" +msgstr "描述" -msgid "Don't show again" -msgstr "不再顯示" +msgid "Edit" +msgstr "編輯" -msgid "Download tar" -msgstr "下載 tar" +msgid "Edit Pipeline Schedule %{id}" +msgstr "編輯 %{id} 流水線計劃" -msgid "Download tar.bz2" -msgstr "下載 tar.bz2" +msgid "Failed to change the owner" +msgstr "無法變更所有者" -msgid "Download tar.gz" -msgstr "下載 tar.gz" +msgid "Failed to remove the pipeline schedule" +msgstr "無法刪除流水線計劃" -msgid "Download zip" -msgstr "下載 zip" - -msgid "DownloadArtifacts|Download" -msgstr "下載" - -msgid "DownloadSource|Download" -msgstr "下載" - -msgid "Files" -msgstr "文件" - -msgid "Find by path" -msgstr "按路徑查找" - -msgid "Find file" -msgstr "查找文件" +msgid "Filter" +msgstr "過濾" msgid "FirstPushedBy|First" msgstr "首次推送" @@ -244,57 +92,24 @@ msgstr "首次推送" msgid "FirstPushedBy|pushed by" msgstr "推送者:" -msgid "ForkedFromProjectPath|Forked from" -msgstr "離開" - -msgid "Forks" -msgstr "派生" - msgid "From issue creation until deploy to production" msgstr "從創建議題到部署到生產環境" msgid "From merge request merge until deploy to production" msgstr "從合併請求的合併到部署至生產環境" -msgid "Go to your fork" -msgstr "跳轉到您的派生項目" - -msgid "GoToYourFork|Fork" -msgstr "跳轉到您的" - -msgid "Home" -msgstr "主頁" - -msgid "Housekeeping successfully started" -msgstr "已開始維護" - -msgid "Import repository" -msgstr "導入存儲庫" +msgid "Interval Pattern" +msgstr "間隔模式" msgid "Introducing Cycle Analytics" msgstr "週期分析簡介" -msgid "LFSStatus|Disabled" -msgstr "禁用" - -msgid "LFSStatus|Enabled" -msgstr "啟用" - msgid "Last %d day" msgid_plural "Last %d days" msgstr[0] "最後 %d 天" -msgid "Last Update" -msgstr "最後更新" - -msgid "Last commit" -msgstr "最後提交" - -msgid "Leave group" -msgstr "離開群組" - -msgid "Leave project" -msgstr "離開項目" +msgid "Last Pipeline" +msgstr "最新流水線" msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" @@ -303,36 +118,15 @@ msgstr[0] "最多顯示 %d 個事件" msgid "Median" msgstr "中位數" -msgid "MissingSSHKeyWarningLink|add an SSH key" -msgstr "添加一個 SSH 公鑰" - msgid "New Issue" msgid_plural "New Issues" msgstr[0] "新議題" -msgid "New branch" -msgstr "新分支" +msgid "New Pipeline Schedule" +msgstr "創建流水線計劃" -msgid "New directory" -msgstr "新目錄" - -msgid "New file" -msgstr "新文件" - -msgid "New issue" -msgstr "新議題" - -msgid "New merge request" -msgstr "新合併請求" - -msgid "New snippet" -msgstr "新代碼片段" - -msgid "New tag" -msgstr "新標籤" - -msgid "No repository" -msgstr "沒有存儲庫" +msgid "No schedules" +msgstr "沒有計劃" msgid "Not available" msgstr "不可用" @@ -340,131 +134,54 @@ 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 "OpenedNDaysAgo|Opened" msgstr "開始於" +msgid "Owner" +msgstr "所有者" + msgid "Pipeline Health" msgstr "流水線健康指標" -msgid "Project '%{project_name}' queued for deletion." -msgstr "項目 '%{project_name}' 已進入刪除隊列。" +msgid "Pipeline Schedule" +msgstr "流水線計劃" -msgid "Project '%{project_name}' was successfully created." -msgstr "項目 '%{project_name}' 已創建完成。" +msgid "Pipeline Schedules" +msgstr "流水線計劃" -msgid "Project '%{project_name}' was successfully updated." -msgstr "項目 '%{project_name}' 已更新完成。" +msgid "PipelineSchedules|Activated" +msgstr "已激活" -msgid "Project '%{project_name}' will be deleted." -msgstr "項目 '%{project_name}' 已刪除。" +msgid "PipelineSchedules|Active" +msgstr "激活" -msgid "Project access must be granted explicitly to each user." -msgstr "訪問項目必須明確授權給每個用戶。" +msgid "PipelineSchedules|All" +msgstr "所有" -msgid "Project export could not be deleted." -msgstr "無法刪除項目導出。" +msgid "PipelineSchedules|Inactive" +msgstr "等待" -msgid "Project export has been deleted." -msgstr "項目導出已刪除。" +msgid "PipelineSchedules|Next Run" +msgstr "下壹個運行" -msgid "" -"Project export link has expired. Please generate a new export from your " -"project settings." -msgstr "項目導出鏈接已過期。請從您的項目設置中生成新的導出。" +msgid "PipelineSchedules|None" +msgstr "無" -msgid "Project export started. A download link will be sent by email." -msgstr "項目導出已開始。下載鏈接將通過電子郵件發送。" +msgid "PipelineSchedules|Provide a short description for this pipeline" +msgstr "為此流水線提供簡短描述" -msgid "Project home" -msgstr "項目主頁" +msgid "PipelineSchedules|Take ownership" +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 "PipelineSchedules|Target" +msgstr "目標" msgid "ProjectLifecycle|Stage" -msgstr "項目生命週期" - -msgid "ProjectNetworkGraph|Graph" -msgstr "分支圖" +msgstr "階段" msgid "Read more" msgstr "了解更多" -msgid "Readme" -msgstr "自述文件" - -msgid "RefSwitcher|Branches" -msgstr "分支" - -msgid "RefSwitcher|Tags" -msgstr "標籤" - msgid "Related Commits" msgstr "相關的提交" @@ -481,75 +198,41 @@ msgid "Related Merge Requests" msgstr "相關的合併請求" msgid "Related Merged Requests" -msgstr "相關已合併的合並請求" +msgstr "相關已合併的合併請求" -msgid "Remind later" -msgstr "稍後提醒" +msgid "Save pipeline schedule" +msgstr "保存流水線計劃" -msgid "Remove project" -msgstr "刪除項目" +msgid "Schedule a new pipeline" +msgstr "新增流水線計劃" -msgid "Request Access" -msgstr "申請訪問" +msgid "Select a timezone" +msgstr "選擇時區" -msgid "Search branches and tags" -msgstr "搜索分支和標籤" - -msgid "Select Archive Format" -msgstr "選擇下載格式" - -msgid "Set a password on your account to pull or push via %{protocol}" -msgstr "為您的賬戶添加壹個用於推送或拉取的 %{protocol} 密碼。" - -msgid "Set up CI" -msgstr "設置 CI" - -msgid "Set up Koding" -msgstr "設置 Koding" - -msgid "Set up auto deploy" -msgstr "設置自動部署" - -msgid "SetPasswordToCloneLink|set a password" -msgstr "設置密碼" +msgid "Select target branch" +msgstr "選擇目標分支" msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "顯示 %d 個事件" -msgid "Source code" -msgstr "源代碼" - -msgid "StarProject|Star" -msgstr "星標" - -msgid "Switch branch/tag" -msgstr "切換分支/標籤" - -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "標籤" - -msgid "Tags" -msgstr "標籤" +msgid "Target Branch" +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 "編碼階段概述了從第一次提交到創建合併請求的時間。創建第壹個合並請求後,數據將自動添加到此處。" +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 "議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建一個議題後,數據將自動添加到此處。" +msgstr "議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建壹個議題後,數據將自動添加到此處。" msgid "The phase of the development lifecycle." msgstr "項目生命週期中的各個階段。" @@ -566,26 +249,17 @@ msgid "" "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 "評審階段概述了從創建合並請求到合併的時間。當創建第壹個合並請求後,數據將自動添加到此處。" +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 "預發布階段概述了合並請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。" +msgstr "預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。" msgid "" "The testing stage shows the time GitLab CI takes to run every pipeline for " @@ -600,12 +274,7 @@ 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 "中位數是一個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。" - -msgid "" -"This means you can not push code until you create an empty repository or " -"import existing one." -msgstr "在創建一個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。" +msgstr "中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。" msgid "Time before an issue gets scheduled" msgstr "議題被列入日程表的時間" @@ -614,134 +283,11 @@ msgid "Time before an issue starts implementation" msgstr "開始進行編碼前的時間" msgid "Time between merge request creation and merge/close" -msgstr "從創建合併請求到被合並或關閉的時間" +msgstr "從創建合併請求到被合併或關閉的時間" msgid "Time until first merge request" msgstr "創建第壹個合併請求之前的時間" -msgid "Timeago|%s days ago" -msgstr "%s 天前" - -msgid "Timeago|%s days remaining" -msgstr "剩餘 %s 天" - -msgid "Timeago|%s hours remaining" -msgstr "剩餘 %s 小時" - -msgid "Timeago|%s minutes ago" -msgstr "%s 分鐘前" - -msgid "Timeago|%s minutes remaining" -msgstr "剩餘 %s 分鐘" - -msgid "Timeago|%s months ago" -msgstr "%s 個月前" - -msgid "Timeago|%s months remaining" -msgstr "剩餘 %s 月" - -msgid "Timeago|%s seconds remaining" -msgstr "剩餘 %s 秒" - -msgid "Timeago|%s weeks ago" -msgstr "%s 星期前" - -msgid "Timeago|%s weeks remaining" -msgstr "剩餘 %s 星期" - -msgid "Timeago|%s years ago" -msgstr "%s 年前" - -msgid "Timeago|%s years remaining" -msgstr "剩餘 %s 年" - -msgid "Timeago|1 day remaining" -msgstr "剩餘 1 天" - -msgid "Timeago|1 hour remaining" -msgstr "剩餘 1 小時" - -msgid "Timeago|1 minute remaining" -msgstr "剩餘 1 分鐘" - -msgid "Timeago|1 month remaining" -msgstr "剩餘 1 個月" - -msgid "Timeago|1 week remaining" -msgstr "剩餘 1 星期" - -msgid "Timeago|1 year remaining" -msgstr "剩餘 1 年" - -msgid "Timeago|Past due" -msgstr "逾期" - -msgid "Timeago|a day ago" -msgstr "1 天前" - -msgid "Timeago|a month ago" -msgstr "1 個月前" - -msgid "Timeago|a week ago" -msgstr "1 星期前" - -msgid "Timeago|a while" -msgstr "剛剛" - -msgid "Timeago|a year ago" -msgstr "1 年前" - -msgid "Timeago|about %s hours ago" -msgstr "大約 %s 小時前" - -msgid "Timeago|about a minute ago" -msgstr "大約 1 分鐘前" - -msgid "Timeago|about an hour ago" -msgstr "大約 1 小時前" - -msgid "Timeago|in %s days" -msgstr "在 %s 天" - -msgid "Timeago|in %s hours" -msgstr "在 %s 小時" - -msgid "Timeago|in %s minutes" -msgstr "在 %s 分鐘" - -msgid "Timeago|in %s months" -msgstr "在 %s 個月" - -msgid "Timeago|in %s seconds" -msgstr "在 %s 秒" - -msgid "Timeago|in %s weeks" -msgstr "在 %s 星期" - -msgid "Timeago|in %s years" -msgstr "在 %s 年" - -msgid "Timeago|in 1 day" -msgstr "在 1 天" - -msgid "Timeago|in 1 hour" -msgstr "在 1 小時" - -msgid "Timeago|in 1 minute" -msgstr "在 1 分鐘" - -msgid "Timeago|in 1 month" -msgstr "在 1 月" - -msgid "Timeago|in 1 week" -msgstr "在 1 星期" - -msgid "Timeago|in 1 year" -msgstr "在 1 年" - -msgid "Timeago|less than a minute ago" -msgstr "不到 1 分鐘前" - msgid "Time|hr" msgid_plural "Time|hrs" msgstr[0] "小時" @@ -759,101 +305,16 @@ msgstr "總時間" msgid "Total test time for all commits/merges" msgstr "所有提交和合併的總測試時間" -msgid "Unstar" -msgstr "取消" - -msgid "Upload New File" -msgstr "上傳新文件" - -msgid "Upload file" -msgstr "上傳文件" - -msgid "Use your global notification setting" -msgstr "使用全局通知設置" - -msgid "VisibilityLevel|Internal" -msgstr "內部" - -msgid "VisibilityLevel|Private" -msgstr "私有" - -msgid "VisibilityLevel|Public" -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 "Withdraw Access Request" -msgstr "取消訪問請求" - -msgid "" -"You are going to remove %{project_name_with_namespace}.\n" -"Removed project CANNOT be restored!\n" -"Are you ABSOLUTELY sure?" -msgstr "您將要刪除 %{project_name_with_namespace}。\n" -"已刪除的項目無法恢復!\n" -"妳確定繼續嗎?" - -msgid "" -"You are going to remove the fork relationship to source project " -"%{forked_from_project}. Are you ABSOLUTELY sure?" -msgstr "將刪除與源項目 %{forked_from_project} 的派生關係。妳確定繼續嗎?" - -msgid "" -"You are going to transfer %{project_name_with_namespace} to another owner. " -"Are you ABSOLUTELY sure?" -msgstr "將 %{project_name_with_namespace} 轉義給另一個所有者。妳確定繼續嗎?" - -msgid "You can only add files when you are on a branch" -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 "在您的賬戶上 %{set_password_link} 之前, 您將無法通過 %{protocol} 拉取或推送代碼。" - -msgid "" -"You won't be able to pull or push project code via SSH until you " -"%{add_ssh_key_link} to your profile" -msgstr "在您的個人資料中添加 %{add_ssh_key_link} 之前, 您將無法通過 SSH 拉取或推送代碼。" - -msgid "Your name" -msgstr "您的名字" - -msgid "committed" -msgstr "提交" - msgid "day" msgid_plural "days" msgstr[0] "天" -msgid "notification emails" -msgstr "通知郵件" - diff --git a/locale/zh_HK/gitlab.po.time_stamp b/locale/zh_HK/gitlab.po.time_stamp index 0519ecba6ea..e69de29bb2d 100644 --- a/locale/zh_HK/gitlab.po.time_stamp +++ b/locale/zh_HK/gitlab.po.time_stamp @@ -1 +0,0 @@ - \ No newline at end of file From 9a849468716655f3656e80bd6b1948329ad08285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 13 Jun 2017 11:25:16 +0800 Subject: [PATCH 0067/1380] Optimization 'zh_HK' translation 1. Fix missing translations --- app/assets/javascripts/locale/zh_HK/app.js | 2 +- locale/zh_HK/gitlab.po | 763 ++++++++++++++++++++- locale/zh_HK/gitlab.po.time_stamp | 1 + 3 files changed, 755 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/locale/zh_HK/app.js b/app/assets/javascripts/locale/zh_HK/app.js index fcd5795c8bb..bfc6f7e5db4 100644 --- a/app/assets/javascripts/locale/zh_HK/app.js +++ b/app/assets/javascripts/locale/zh_HK/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-07 21:22+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-09 01:09-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://www.transifex.com/gitlab-zh/teams/75177/zh_HK/)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"Are you sure you want to delete this pipeline schedule?":["您確定要刪除此流水線計劃嗎?"],"ByAuthor|by":["作者:"],"Cancel":["取消"],"Commit":["提交"],"Cron Timezone":["Cron 時區"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Delete":["刪除"],"Deploy":["部署"],"Description":["描述"],"Edit":["編輯"],"Edit Pipeline Schedule %{id}":["編輯 %{id} 流水線計劃"],"Failed to change the owner":["無法變更所有者"],"Failed to remove the pipeline schedule":["無法刪除流水線計劃"],"Filter":["過濾"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Interval Pattern":["間隔模式"],"Introducing Cycle Analytics":["週期分析簡介"],"Last %d day":["最後 %d 天"],"Last Pipeline":["最新流水線"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"New Issue":["新議題"],"New Pipeline Schedule":["創建流水線計劃"],"No schedules":["沒有計劃"],"Not available":["不可用"],"Not enough data":["數據不足"],"OpenedNDaysAgo|Opened":["開始於"],"Owner":["所有者"],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":["流水線計劃"],"Pipeline Schedules":["流水線計劃"],"PipelineSchedules|Activated":["已激活"],"PipelineSchedules|Active":["激活"],"PipelineSchedules|All":["所有"],"PipelineSchedules|Inactive":["等待"],"PipelineSchedules|Next Run":["下壹個運行"],"PipelineSchedules|None":["無"],"PipelineSchedules|Provide a short description for this pipeline":["為此流水線提供簡短描述"],"PipelineSchedules|Take ownership":["取得所有權"],"PipelineSchedules|Target":["目標"],"ProjectLifecycle|Stage":["階段"],"Read more":["了解更多"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合併請求"],"Save pipeline schedule":["保存流水線計劃"],"Schedule a new pipeline":["新增流水線計劃"],"Select a timezone":["選擇時區"],"Select target branch":["選擇目標分支"],"Showing %d event":["顯示 %d 個事件"],"Target Branch":["目標分支"],"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.":["編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建壹個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"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.":["評審階段概述了從創建合併請求到合併的時間。當創建第壹個合併請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合併或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"You need permission.":["您需要相關的權限。"],"day":["天"]}}}; \ No newline at end of file +var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-12 11:08-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"%{commit_author_link} committed %{commit_timeago}":["由 %{commit_author_link} 提交於 %{commit_timeago}"],"About auto deploy":["關於自動部署"],"Active":["激活"],"Activity":["活動"],"Add Changelog":["添加變更日誌"],"Add Contribution guide":["添加貢獻指南"],"Add License":["添加許可證"],"Add an SSH key to your profile to pull or push via SSH.":["新增壹個用於推送或拉取的 SSH 秘鑰到您的個人賬戶中。"],"Add new directory":["添加新目錄"],"Archived project! Repository is read-only":["歸檔項目!存儲庫為只讀"],"Are you sure you want to delete this pipeline schedule?":["您確定要刪除此流水線計劃嗎?"],"Attach a file by drag & drop or %{upload_link}":["拖放文件到此處或者 %{upload_link}"],"Branch":["分支"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["分支 %{branch_name} 已創建。如要設置自動部署, 請選擇合適的 GitLab CI Yaml 模板併提交更改。%{link_to_autodeploy_doc}"],"Branches":["分支"],"Browse files":["瀏覽文件"],"ByAuthor|by":["作者:"],"CI configuration":["CI 配置"],"Cancel":["取消"],"ChangeTypeActionLabel|Pick into branch":["挑選到分支"],"ChangeTypeActionLabel|Revert in branch":["還原分支"],"ChangeTypeAction|Cherry-pick":["優選"],"ChangeType|commit":["提交"],"ChangeType|merge request":["合併請求"],"Changelog":["變更日誌"],"Charts":["統計圖"],"Cherry-pick this commit":["優選此提交"],"Cherry-pick this merge-request":["優選此合併請求"],"CiStatusLabel|canceled":["已取消"],"CiStatusLabel|created":["已創建"],"CiStatusLabel|failed":["已失敗"],"CiStatusLabel|manual action":["手動操作"],"CiStatusLabel|passed":["已通過"],"CiStatusLabel|passed with warnings":["已通過但有警告"],"CiStatusLabel|pending":["等待中"],"CiStatusLabel|skipped":["已跳過"],"CiStatusLabel|waiting for manual action":["等待手動操作"],"CiStatusText|blocked":["已阻塞"],"CiStatusText|canceled":["已取消"],"CiStatusText|created":["已創建"],"CiStatusText|failed":["已失敗"],"CiStatusText|manual":["待手動"],"CiStatusText|passed":["已通過"],"CiStatusText|pending":["等待中"],"CiStatusText|skipped":["已跳過"],"CiStatus|running":["運行中"],"Commit":["提交"],"Commit message":["提交信息"],"CommitMessage|Add %{file_name}":["添加 %{file_name}"],"Commits":["提交"],"Commits|History":["歷史"],"Committed by":["作者:"],"Compare":["比較"],"Contribution guide":["貢獻指南"],"Contributors":["貢獻者"],"Copy URL to clipboard":["複製URL到剪貼板"],"Copy commit SHA to clipboard":["複製提交 SHA 到剪貼板"],"Create New Directory":["創建新目錄"],"Create directory":["創建目錄"],"Create empty bare repository":["創建空的存儲庫"],"Create merge request":["創建合併請求"],"Create new...":["創建..."],"CreateNewFork|Fork":["派生"],"CreateTag|Tag":["標簽"],"Cron Timezone":["Cron 時區"],"Cron syntax":["Cron 語法"],"Custom":["自定義"],"Custom notification events":["自定義通知事件"],"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}.":["自定義通知級別與參與級別相同。使用自定義通知級別,您只能收到所選定事件通知。想瞭解更多信息,請查看 %{notification_link}."],"Cycle Analytics":["週期分析"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Define a custom pattern with cron syntax":["使用 Cron 語法定義自定義模式"],"Delete":["刪除"],"Deploy":["部署"],"Description":["描述"],"Directory name":["目錄名稱"],"Don't show again":["不再顯示"],"Download":["下載"],"Download tar":["下載 tar"],"Download tar.bz2":["下載 tar.bz2"],"Download tar.gz":["下載 tar.gz"],"Download zip":["下載 zip"],"DownloadArtifacts|Download":["下載"],"DownloadCommit|Email Patches":["電子郵件補丁"],"DownloadCommit|Plain Diff":["Diff 文件"],"DownloadSource|Download":["下載"],"Edit":["編輯"],"Edit Pipeline Schedule %{id}":["編輯 %{id} 流水線計劃"],"Every day (at 4:00am)":["每天(淩晨4點)"],"Every month (on the 1st at 4:00am)":["每月1日(淩晨4點)"],"Every week (Sundays at 4:00am)":["每周日(淩晨4點)"],"Failed to change the owner":["無法變更所有者"],"Failed to remove the pipeline schedule":["無法刪除流水線計劃"],"Files":["文件"],"Find by path":["按路徑查找"],"Find file":["查找文件"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"Fork":["派生"],"ForkedFromProjectPath|Forked from":["派生自"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Go to your fork":["跳轉到您的派生項目"],"GoToYourFork|Fork":["跳轉到您的派生項目"],"Home":["首頁"],"Housekeeping successfully started":["已開始維護"],"Import repository":["導入存儲庫"],"Interval Pattern":["間隔模式"],"Introducing Cycle Analytics":["週期分析簡介"],"LFSStatus|Disabled":["禁用"],"LFSStatus|Enabled":["啟用"],"Last %d day":["最後 %d 天"],"Last Pipeline":["最新流水線"],"Last Update":["最後更新"],"Last commit":["最後提交"],"Learn more in the":["了解更多"],"Leave group":["離開群組"],"Leave project":["離開項目"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"MissingSSHKeyWarningLink|add an SSH key":["添加壹個 SSH 公鑰"],"New Issue":["新議題"],"New Pipeline Schedule":["創建流水線計劃"],"New branch":["新分支"],"New directory":["新增目錄"],"New file":["新增文件"],"New issue":["新議題"],"New merge request":["新合併請求"],"New schedule":["新计划"],"New snippet":["新代碼片段"],"New tag":["新標籤"],"No repository":["沒有存儲庫"],"No schedules":["沒有計劃"],"Not available":["不可用"],"Not enough data":["數據不足"],"Notification events":["通知事件"],"NotificationEvent|Close issue":["關閉議題"],"NotificationEvent|Close merge request":["關閉合併請求"],"NotificationEvent|Failed pipeline":["流水線失敗"],"NotificationEvent|Merge merge request":["合併請求被合併"],"NotificationEvent|New issue":["新議題"],"NotificationEvent|New merge request":["新合併請求"],"NotificationEvent|New note":["新評論"],"NotificationEvent|Reassign issue":["重新指派議題"],"NotificationEvent|Reassign merge request":["重新指派合併請求"],"NotificationEvent|Reopen issue":["重新打開議題"],"NotificationEvent|Successful pipeline":["流水線成功完成"],"NotificationLevel|Custom":["自定義"],"NotificationLevel|Disabled":["禁用"],"NotificationLevel|Global":["全局"],"NotificationLevel|On mention":["提及"],"NotificationLevel|Participate":["參與"],"NotificationLevel|Watch":["關注"],"OfSearchInADropdown|Filter":["篩選"],"OpenedNDaysAgo|Opened":["開始於"],"Options":["選項"],"Owner":["所有者"],"Pipeline":["流水線"],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":["流水線計劃"],"Pipeline Schedules":["流水線計劃"],"PipelineSchedules|Activated":["已激活"],"PipelineSchedules|Active":["激活"],"PipelineSchedules|All":["所有"],"PipelineSchedules|Inactive":["等待"],"PipelineSchedules|Next Run":["下壹個運行"],"PipelineSchedules|None":["無"],"PipelineSchedules|Provide a short description for this pipeline":["為此流水線提供簡短描述"],"PipelineSchedules|Take ownership":["取得所有權"],"PipelineSchedules|Target":["目標"],"Project '%{project_name}' queued for deletion.":["項目 '%{project_name}' 已進入刪除隊列。"],"Project '%{project_name}' was successfully created.":["項目 '%{project_name}' 已創建完成。"],"Project '%{project_name}' was successfully updated.":["項目 '%{project_name}' 已更新完成。"],"Project '%{project_name}' will be deleted.":["項目 '%{project_name}' 已刪除。"],"Project access must be granted explicitly to each user.":["項目訪問權限必須明確授權給每個用戶。"],"Project export could not be deleted.":["無法刪除項目導出。"],"Project export has been deleted.":["項目導出已刪除。"],"Project export link has expired. Please generate a new export from your project settings.":["項目導出鏈接已過期。請從項目設置中重新生成項目導出。"],"Project export started. A download link will be sent by email.":["項目導出已開始。下載鏈接將通過電子郵件發送。"],"Project home":["項目首頁"],"ProjectFeature|Disabled":["禁用"],"ProjectFeature|Everyone with access":["任何人都可訪問"],"ProjectFeature|Only team members":["只有團隊成員"],"ProjectFileTree|Name":["名稱"],"ProjectLastActivity|Never":["從未"],"ProjectLifecycle|Stage":["階段"],"ProjectNetworkGraph|Graph":["分支圖"],"Read more":["了解更多"],"Readme":["自述文件"],"RefSwitcher|Branches":["分支"],"RefSwitcher|Tags":["標籤"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合併請求"],"Remind later":["稍後提醒"],"Remove project":["刪除項目"],"Request Access":["申請訪問"],"Revert this commit":["還原此提交"],"Revert this merge-request":["還原此合併請求"],"Save pipeline schedule":["保存流水線計劃"],"Schedule a new pipeline":["新增流水線計劃"],"Scheduling Pipelines":["流水線計劃"],"Search branches and tags":["搜索分支和標籤"],"Select Archive Format":["選擇下載格式"],"Select a timezone":["選擇時區"],"Select target branch":["選擇目標分支"],"Set a password on your account to pull or push via %{protocol}":["為您的賬戶添加壹個用於推送或拉取的 %{protocol} 密碼。"],"Set up CI":["設置 CI"],"Set up Koding":["設置 Koding"],"Set up auto deploy":["設置自動部署"],"SetPasswordToCloneLink|set a password":["設置密碼"],"Showing %d event":["顯示 %d 個事件"],"Source code":["源代碼"],"StarProject|Star":["星標"],"Start a new merge request with these changes":["包含這些更改到 新合併請求"],"Switch branch/tag":["切換分支/標籤"],"Tag":["標籤"],"Tags":["標籤"],"Target Branch":["目標分支"],"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.":["編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"The fork relationship has been removed.":["派生關係已被刪除。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建壹個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["流水線計劃會針對特定的分支或標簽在以後重復運行流水線。這些預定的流水線將根據其相關用戶繼承有限的項目訪問。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"The project can be accessed by any logged in user.":["該項目允許已登錄的用戶訪問。"],"The project can be accessed without any authentication.":["該項目允許任何人訪問。"],"The repository for this project does not exist.":["此項目的存儲庫不存在。"],"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.":["評審階段概述了從創建合併請求到合併的時間。當創建第壹個合併請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"This means you can not push code until you create an empty repository or import existing one.":["在創建壹個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合併或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Timeago|%s days ago":["%s 天前"],"Timeago|%s days remaining":["剩餘 %s 天"],"Timeago|%s hours remaining":["剩餘 %s 小時"],"Timeago|%s minutes ago":["%s 分鐘前"],"Timeago|%s minutes remaining":["剩餘 %s 分鐘"],"Timeago|%s months ago":["%s 個月前"],"Timeago|%s months remaining":["剩餘 %s 月"],"Timeago|%s seconds remaining":["剩餘 %s 秒"],"Timeago|%s weeks ago":["%s 星期前"],"Timeago|%s weeks remaining":["剩餘 %s 星期"],"Timeago|%s years ago":["%s 年前"],"Timeago|%s years remaining":["剩餘 %s 年"],"Timeago|1 day remaining":["剩餘 1 天"],"Timeago|1 hour remaining":["剩餘 1 小時"],"Timeago|1 minute remaining":["剩餘 1 分鐘"],"Timeago|1 month remaining":["剩餘 1 個月"],"Timeago|1 week remaining":["剩餘 1 星期"],"Timeago|1 year remaining":["剩餘 1 年"],"Timeago|Past due":["逾期"],"Timeago|a day ago":["1 天前"],"Timeago|a month ago":["1 個月前"],"Timeago|a week ago":["1 星期前"],"Timeago|a while":["剛剛"],"Timeago|a year ago":["1 年前"],"Timeago|about %s hours ago":["大約 %s 小時前"],"Timeago|about a minute ago":["大約 1 分鐘前"],"Timeago|about an hour ago":["大約 1 小時前"],"Timeago|in %s days":["在 %s 天"],"Timeago|in %s hours":["在 %s 小時"],"Timeago|in %s minutes":["在 %s 分鐘"],"Timeago|in %s months":["在 %s 個月"],"Timeago|in %s seconds":["在 %s 秒"],"Timeago|in %s weeks":["在 %s 星期"],"Timeago|in %s years":["在 %s 年"],"Timeago|in 1 day":["在 1 天"],"Timeago|in 1 hour":["在 1 小時"],"Timeago|in 1 minute":["在 1 分鐘"],"Timeago|in 1 month":["在 1 月"],"Timeago|in 1 week":["在 1 星期"],"Timeago|in 1 year":["在 1 年"],"Timeago|less than a minute ago":["不到 1 分鐘前"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Unstar":["取消星標"],"Upload New File":["上傳新文件"],"Upload file":["上傳文件"],"Use your global notification setting":["使用全局通知設置"],"VisibilityLevel|Internal":["內部"],"VisibilityLevel|Private":["私有"],"VisibilityLevel|Public":["公開"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"Withdraw Access Request":["取消訪問請求"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["您將要刪除 %{project_name_with_namespace}。\\n已刪除的項目無法恢復!\\n您確定繼續嗎?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["您將刪除與源項目 %{forked_from_project} 的派生關系。您確定繼續嗎?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["將 %{project_name_with_namespace} 轉義給另壹個所有者。您確定繼續嗎?"],"You can only add files when you are on a branch":["您只能在分支上添加文件"],"You must sign in to star a project":["您必須登錄才能對項目加星標"],"You need permission.":["您需要相關的權限。"],"You will not get any notifications via email":["您將不會收到任何通知郵件"],"You will only receive notifications for the events you choose":["您只會收到您選擇的事件通知"],"You will only receive notifications for threads you have participated in":["您只會收到您參與的主題的通知"],"You will receive notifications for any activity":["您將不會收到任何通知"],"You will receive notifications only for comments in which you were @mentioned":["您只會收到評論中提及(@)您的通知"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["在您的賬戶上 %{set_password_link} 之前, 您將無法通過 %{protocol} 拉取或推送代碼。"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["在您的個人資料中添加 %{add_ssh_key_link} 之前, 您將無法通過 SSH 拉取或推送代碼。"],"Your name":["您的名字"],"day":["天"],"notification emails":["通知郵件"],"parent":["父級"],"pipeline schedules documentation":["流水線計劃文檔"],"with stage":["於階段"]}}}; \ No newline at end of file diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po index 4b02ba19305..22fe5e4f807 100644 --- a/locale/zh_HK/gitlab.po +++ b/locale/zh_HK/gitlab.po @@ -1,40 +1,240 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gitlab package. -# FIRST AUTHOR , YEAR. # Huang Tao , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-07 21:22+0200\n" +"POT-Creation-Date: 2017-06-12 19:29-0500\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-09 01:09-0400\n" +"PO-Revision-Date: 2017-06-12 11:08-0400\n" "Last-Translator: Huang Tao \n" -"Language-Team: Chinese (Hong Kong) (https://www.transifex.com/gitlab-zh/" -"teams/75177/zh_HK/)\n" +"Language-Team: Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)\n" "Language: zh-HK\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Zanata 3.9.6\n" +msgid "%{commit_author_link} committed %{commit_timeago}" +msgstr "由 %{commit_author_link} 提交於 %{commit_timeago}" + +msgid "About auto deploy" +msgstr "關於自動部署" + +msgid "Active" +msgstr "激活" + +msgid "Activity" +msgstr "活動" + +msgid "Add Changelog" +msgstr "添加變更日誌" + +msgid "Add Contribution guide" +msgstr "添加貢獻指南" + +msgid "Add License" +msgstr "添加許可證" + +msgid "Add an SSH key to your profile to pull or push via SSH." +msgstr "新增壹個用於推送或拉取的 SSH 秘鑰到您的個人賬戶中。" + +msgid "Add new directory" +msgstr "添加新目錄" + +msgid "Archived project! Repository is read-only" +msgstr "歸檔項目!存儲庫為只讀" + msgid "Are you sure you want to delete this pipeline schedule?" msgstr "您確定要刪除此流水線計劃嗎?" +msgid "Attach a file by drag & drop or %{upload_link}" +msgstr "拖放文件到此處或者 %{upload_link}" + +msgid "Branch" +msgid_plural "Branches" +msgstr[0] "分支" + +msgid "" +"Branch %{branch_name} was created. To set up auto deploy, " +"choose a GitLab CI Yaml template and commit your changes. " +"%{link_to_autodeploy_doc}" +msgstr "" +"分支 %{branch_name} 已創建。如要設置自動部署, 請選擇合適的 GitLab CI Yaml " +"模板併提交更改。%{link_to_autodeploy_doc}" + +msgid "Branches" +msgstr "分支" + +msgid "Browse files" +msgstr "瀏覽文件" + msgid "ByAuthor|by" msgstr "作者:" +msgid "CI configuration" +msgstr "CI 配置" + msgid "Cancel" msgstr "取消" +msgid "ChangeTypeActionLabel|Pick into branch" +msgstr "挑選到分支" + +msgid "ChangeTypeActionLabel|Revert in branch" +msgstr "還原分支" + +msgid "ChangeTypeAction|Cherry-pick" +msgstr "優選" + +msgid "ChangeType|commit" +msgstr "提交" + +msgid "ChangeType|merge request" +msgstr "合併請求" + +msgid "Changelog" +msgstr "變更日誌" + +msgid "Charts" +msgstr "統計圖" + +msgid "Cherry-pick this commit" +msgstr "優選此提交" + +msgid "Cherry-pick this merge-request" +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 "Commit" msgid_plural "Commits" msgstr[0] "提交" +msgid "Commit message" +msgstr "提交信息" + +msgid "CommitMessage|Add %{file_name}" +msgstr "添加 %{file_name}" + +msgid "Commits" +msgstr "提交" + +msgid "Commits|History" +msgstr "歷史" + +msgid "Committed by" +msgstr "作者:" + +msgid "Compare" +msgstr "比較" + +msgid "Contribution guide" +msgstr "貢獻指南" + +msgid "Contributors" +msgstr "貢獻者" + +msgid "Copy URL to clipboard" +msgstr "複製URL到剪貼板" + +msgid "Copy commit SHA to clipboard" +msgstr "複製提交 SHA 到剪貼板" + +msgid "Create New Directory" +msgstr "創建新目錄" + +msgid "Create directory" +msgstr "創建目錄" + +msgid "Create empty bare repository" +msgstr "創建空的存儲庫" + +msgid "Create merge request" +msgstr "創建合併請求" + +msgid "Create new..." +msgstr "創建..." + +msgid "CreateNewFork|Fork" +msgstr "派生" + +msgid "CreateTag|Tag" +msgstr "標簽" + msgid "Cron Timezone" msgstr "Cron 時區" +msgid "Cron syntax" +msgstr "Cron 語法" + +msgid "Custom" +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 "" +"自定義通知級別與參與級別相同。使用自定義通知級別,您只能收到所選定事件通知。想瞭解更多信息,請查看 %{notification_link}." + +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." @@ -61,6 +261,9 @@ msgstr "預發布" msgid "CycleAnalyticsStage|Test" msgstr "測試" +msgid "Define a custom pattern with cron syntax" +msgstr "使用 Cron 語法定義自定義模式" + msgid "Delete" msgstr "刪除" @@ -71,20 +274,68 @@ msgstr[0] "部署" msgid "Description" msgstr "描述" +msgid "Directory name" +msgstr "目錄名稱" + +msgid "Don't show again" +msgstr "不再顯示" + +msgid "Download" +msgstr "下載" + +msgid "Download tar" +msgstr "下載 tar" + +msgid "Download tar.bz2" +msgstr "下載 tar.bz2" + +msgid "Download tar.gz" +msgstr "下載 tar.gz" + +msgid "Download zip" +msgstr "下載 zip" + +msgid "DownloadArtifacts|Download" +msgstr "下載" + +msgid "DownloadCommit|Email Patches" +msgstr "電子郵件補丁" + +msgid "DownloadCommit|Plain Diff" +msgstr "Diff 文件" + +msgid "DownloadSource|Download" +msgstr "下載" + msgid "Edit" msgstr "編輯" msgid "Edit Pipeline Schedule %{id}" msgstr "編輯 %{id} 流水線計劃" +msgid "Every day (at 4:00am)" +msgstr "每天(淩晨4點)" + +msgid "Every month (on the 1st at 4:00am)" +msgstr "每月1日(淩晨4點)" + +msgid "Every week (Sundays at 4:00am)" +msgstr "每周日(淩晨4點)" + msgid "Failed to change the owner" msgstr "無法變更所有者" msgid "Failed to remove the pipeline schedule" msgstr "無法刪除流水線計劃" -msgid "Filter" -msgstr "過濾" +msgid "Files" +msgstr "文件" + +msgid "Find by path" +msgstr "按路徑查找" + +msgid "Find file" +msgstr "查找文件" msgid "FirstPushedBy|First" msgstr "首次推送" @@ -92,18 +343,46 @@ msgstr "首次推送" msgid "FirstPushedBy|pushed by" msgstr "推送者:" +msgid "Fork" +msgid_plural "Forks" +msgstr[0] "派生" + +msgid "ForkedFromProjectPath|Forked from" +msgstr "派生自" + msgid "From issue creation until deploy to production" msgstr "從創建議題到部署到生產環境" msgid "From merge request merge until deploy to production" msgstr "從合併請求的合併到部署至生產環境" +msgid "Go to your fork" +msgstr "跳轉到您的派生項目" + +msgid "GoToYourFork|Fork" +msgstr "跳轉到您的派生項目" + +msgid "Home" +msgstr "首頁" + +msgid "Housekeeping successfully started" +msgstr "已開始維護" + +msgid "Import repository" +msgstr "導入存儲庫" + msgid "Interval Pattern" msgstr "間隔模式" msgid "Introducing Cycle Analytics" msgstr "週期分析簡介" +msgid "LFSStatus|Disabled" +msgstr "禁用" + +msgid "LFSStatus|Enabled" +msgstr "啟用" + msgid "Last %d day" msgid_plural "Last %d days" msgstr[0] "最後 %d 天" @@ -111,6 +390,21 @@ msgstr[0] "最後 %d 天" msgid "Last Pipeline" msgstr "最新流水線" +msgid "Last Update" +msgstr "最後更新" + +msgid "Last commit" +msgstr "最後提交" + +msgid "Learn more in the" +msgstr "了解更多" + +msgid "Leave group" +msgstr "離開群組" + +msgid "Leave project" +msgstr "離開項目" + msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" msgstr[0] "最多顯示 %d 個事件" @@ -118,6 +412,9 @@ msgstr[0] "最多顯示 %d 個事件" msgid "Median" msgstr "中位數" +msgid "MissingSSHKeyWarningLink|add an SSH key" +msgstr "添加壹個 SSH 公鑰" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "新議題" @@ -125,6 +422,33 @@ msgstr[0] "新議題" msgid "New Pipeline Schedule" msgstr "創建流水線計劃" +msgid "New branch" +msgstr "新分支" + +msgid "New directory" +msgstr "新增目錄" + +msgid "New file" +msgstr "新增文件" + +msgid "New issue" +msgstr "新議題" + +msgid "New merge request" +msgstr "新合併請求" + +msgid "New schedule" +msgstr "新计划" + +msgid "New snippet" +msgstr "新代碼片段" + +msgid "New tag" +msgstr "新標籤" + +msgid "No repository" +msgstr "沒有存儲庫" + msgid "No schedules" msgstr "沒有計劃" @@ -134,12 +458,75 @@ 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 "OfSearchInADropdown|Filter" +msgstr "篩選" + msgid "OpenedNDaysAgo|Opened" msgstr "開始於" +msgid "Options" +msgstr "選項" + msgid "Owner" msgstr "所有者" +msgid "Pipeline" +msgstr "流水線" + msgid "Pipeline Health" msgstr "流水線健康指標" @@ -176,12 +563,71 @@ msgstr "取得所有權" msgid "PipelineSchedules|Target" msgstr "目標" +msgid "Project '%{project_name}' queued for deletion." +msgstr "項目 '%{project_name}' 已進入刪除隊列。" + +msgid "Project '%{project_name}' was successfully created." +msgstr "項目 '%{project_name}' 已創建完成。" + +msgid "Project '%{project_name}' was successfully updated." +msgstr "項目 '%{project_name}' 已更新完成。" + +msgid "Project '%{project_name}' will be deleted." +msgstr "項目 '%{project_name}' 已刪除。" + +msgid "Project access must be granted explicitly to each user." +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 "Project home" +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 "Read more" msgstr "了解更多" +msgid "Readme" +msgstr "自述文件" + +msgid "RefSwitcher|Branches" +msgstr "分支" + +msgid "RefSwitcher|Tags" +msgstr "標籤" + msgid "Related Commits" msgstr "相關的提交" @@ -200,22 +646,80 @@ msgstr "相關的合併請求" msgid "Related Merged Requests" msgstr "相關已合併的合併請求" +msgid "Remind later" +msgstr "稍後提醒" + +msgid "Remove project" +msgstr "刪除項目" + +msgid "Request Access" +msgstr "申請訪問" + +msgid "Revert this commit" +msgstr "還原此提交" + +msgid "Revert this merge-request" +msgstr "還原此合併請求" + msgid "Save pipeline schedule" msgstr "保存流水線計劃" msgid "Schedule a new pipeline" msgstr "新增流水線計劃" +msgid "Scheduling Pipelines" +msgstr "流水線計劃" + +msgid "Search branches and tags" +msgstr "搜索分支和標籤" + +msgid "Select Archive Format" +msgstr "選擇下載格式" + msgid "Select a timezone" msgstr "選擇時區" msgid "Select target branch" msgstr "選擇目標分支" +msgid "Set a password on your account to pull or push via %{protocol}" +msgstr "為您的賬戶添加壹個用於推送或拉取的 %{protocol} 密碼。" + +msgid "Set up CI" +msgstr "設置 CI" + +msgid "Set up Koding" +msgstr "設置 Koding" + +msgid "Set up auto deploy" +msgstr "設置自動部署" + +msgid "SetPasswordToCloneLink|set a password" +msgstr "設置密碼" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "顯示 %d 個事件" +msgid "Source code" +msgstr "源代碼" + +msgid "StarProject|Star" +msgstr "星標" + +msgid "Start a new merge request with these changes" +msgstr "包含這些更改到 新合併請求" + +msgid "Switch branch/tag" +msgstr "切換分支/標籤" + +msgid "Tag" +msgid_plural "Tags" +msgstr[0] "標籤" + +msgid "Tags" +msgstr "標籤" + msgid "Target Branch" msgstr "目標分支" @@ -228,6 +732,9 @@ 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. " @@ -237,6 +744,12 @@ 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 " @@ -249,6 +762,15 @@ msgid "" "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 " @@ -276,6 +798,11 @@ msgid "" " 6." msgstr "中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。" +msgid "" +"This means you can not push code until you create an empty repository or " +"import existing one." +msgstr "在創建壹個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。" + msgid "Time before an issue gets scheduled" msgstr "議題被列入日程表的時間" @@ -288,6 +815,129 @@ msgstr "從創建合併請求到被合併或關閉的時間" msgid "Time until first merge request" msgstr "創建第壹個合併請求之前的時間" +msgid "Timeago|%s days ago" +msgstr "%s 天前" + +msgid "Timeago|%s days remaining" +msgstr "剩餘 %s 天" + +msgid "Timeago|%s hours remaining" +msgstr "剩餘 %s 小時" + +msgid "Timeago|%s minutes ago" +msgstr "%s 分鐘前" + +msgid "Timeago|%s minutes remaining" +msgstr "剩餘 %s 分鐘" + +msgid "Timeago|%s months ago" +msgstr "%s 個月前" + +msgid "Timeago|%s months remaining" +msgstr "剩餘 %s 月" + +msgid "Timeago|%s seconds remaining" +msgstr "剩餘 %s 秒" + +msgid "Timeago|%s weeks ago" +msgstr "%s 星期前" + +msgid "Timeago|%s weeks remaining" +msgstr "剩餘 %s 星期" + +msgid "Timeago|%s years ago" +msgstr "%s 年前" + +msgid "Timeago|%s years remaining" +msgstr "剩餘 %s 年" + +msgid "Timeago|1 day remaining" +msgstr "剩餘 1 天" + +msgid "Timeago|1 hour remaining" +msgstr "剩餘 1 小時" + +msgid "Timeago|1 minute remaining" +msgstr "剩餘 1 分鐘" + +msgid "Timeago|1 month remaining" +msgstr "剩餘 1 個月" + +msgid "Timeago|1 week remaining" +msgstr "剩餘 1 星期" + +msgid "Timeago|1 year remaining" +msgstr "剩餘 1 年" + +msgid "Timeago|Past due" +msgstr "逾期" + +msgid "Timeago|a day ago" +msgstr "1 天前" + +msgid "Timeago|a month ago" +msgstr "1 個月前" + +msgid "Timeago|a week ago" +msgstr "1 星期前" + +msgid "Timeago|a while" +msgstr "剛剛" + +msgid "Timeago|a year ago" +msgstr "1 年前" + +msgid "Timeago|about %s hours ago" +msgstr "大約 %s 小時前" + +msgid "Timeago|about a minute ago" +msgstr "大約 1 分鐘前" + +msgid "Timeago|about an hour ago" +msgstr "大約 1 小時前" + +msgid "Timeago|in %s days" +msgstr "在 %s 天" + +msgid "Timeago|in %s hours" +msgstr "在 %s 小時" + +msgid "Timeago|in %s minutes" +msgstr "在 %s 分鐘" + +msgid "Timeago|in %s months" +msgstr "在 %s 個月" + +msgid "Timeago|in %s seconds" +msgstr "在 %s 秒" + +msgid "Timeago|in %s weeks" +msgstr "在 %s 星期" + +msgid "Timeago|in %s years" +msgstr "在 %s 年" + +msgid "Timeago|in 1 day" +msgstr "在 1 天" + +msgid "Timeago|in 1 hour" +msgstr "在 1 小時" + +msgid "Timeago|in 1 minute" +msgstr "在 1 分鐘" + +msgid "Timeago|in 1 month" +msgstr "在 1 月" + +msgid "Timeago|in 1 week" +msgstr "在 1 星期" + +msgid "Timeago|in 1 year" +msgstr "在 1 年" + +msgid "Timeago|less than a minute ago" +msgstr "不到 1 分鐘前" + msgid "Time|hr" msgid_plural "Time|hrs" msgstr[0] "小時" @@ -305,16 +955,109 @@ msgstr "總時間" msgid "Total test time for all commits/merges" msgstr "所有提交和合併的總測試時間" +msgid "Unstar" +msgstr "取消星標" + +msgid "Upload New File" +msgstr "上傳新文件" + +msgid "Upload file" +msgstr "上傳文件" + +msgid "Use your global notification setting" +msgstr "使用全局通知設置" + +msgid "VisibilityLevel|Internal" +msgstr "內部" + +msgid "VisibilityLevel|Private" +msgstr "私有" + +msgid "VisibilityLevel|Public" +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 "Withdraw Access Request" +msgstr "取消訪問請求" + +msgid "" +"You are going to remove %{project_name_with_namespace}.\n" +"Removed project CANNOT be restored!\n" +"Are you ABSOLUTELY sure?" +msgstr "您將要刪除 %{project_name_with_namespace}。\n" +"已刪除的項目無法恢復!\n" +"您確定繼續嗎?" + +msgid "" +"You are going to remove the fork relationship to source project " +"%{forked_from_project}. Are you ABSOLUTELY sure?" +msgstr "您將刪除與源項目 %{forked_from_project} 的派生關系。您確定繼續嗎?" + +msgid "" +"You are going to transfer %{project_name_with_namespace} to another owner. " +"Are you ABSOLUTELY sure?" +msgstr "將 %{project_name_with_namespace} 轉義給另壹個所有者。您確定繼續嗎?" + +msgid "You can only add files when you are on a branch" +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 "在您的賬戶上 %{set_password_link} 之前, 您將無法通過 %{protocol} 拉取或推送代碼。" + +msgid "" +"You won't be able to pull or push project code via SSH until you " +"%{add_ssh_key_link} to your profile" +msgstr "在您的個人資料中添加 %{add_ssh_key_link} 之前, 您將無法通過 SSH 拉取或推送代碼。" + +msgid "Your name" +msgstr "您的名字" + msgid "day" msgid_plural "days" msgstr[0] "天" +msgid "notification emails" +msgstr "通知郵件" + +msgid "parent" +msgid_plural "parents" +msgstr[0] "父級" + +msgid "pipeline schedules documentation" +msgstr "流水線計劃文檔" + +msgid "with stage" +msgid_plural "with stages" +msgstr[0] "於階段" + diff --git a/locale/zh_HK/gitlab.po.time_stamp b/locale/zh_HK/gitlab.po.time_stamp index e69de29bb2d..0519ecba6ea 100644 --- a/locale/zh_HK/gitlab.po.time_stamp +++ b/locale/zh_HK/gitlab.po.time_stamp @@ -0,0 +1 @@ + \ No newline at end of file From 5414733009eb9f7be177744289224b1aedf5cbfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 13 Jun 2017 11:31:37 +0800 Subject: [PATCH 0068/1380] Change the format in changelog --- ...ent_traditional_chinese_in_hong_kong_translation_of_i18n.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml b/changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml index a5eb71b63c6..e383bab23d6 100644 --- a/changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml +++ b/changelogs/unreleased/33442-supplement_traditional_chinese_in_hong_kong_translation_of_i18n.yml @@ -1,4 +1,4 @@ --- title: Supplement Traditional Chinese in Hong Kong translation of Project Page & Repository Page merge_request: 11995 -author:Huang Tao +author: Huang Tao From 0a18b5ec60635264a2234e1524d0f711111ff2ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 13 Jun 2017 17:34:27 +0800 Subject: [PATCH 0069/1380] Optimization 'zh_HK' translation --- app/assets/javascripts/locale/zh_HK/app.js | 2 +- locale/zh_HK/gitlab.po | 22 +++++++++++----------- locale/zh_HK/gitlab.po.time_stamp | 1 - 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/locale/zh_HK/app.js b/app/assets/javascripts/locale/zh_HK/app.js index bfc6f7e5db4..67054b3ef4a 100644 --- a/app/assets/javascripts/locale/zh_HK/app.js +++ b/app/assets/javascripts/locale/zh_HK/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-12 11:08-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"%{commit_author_link} committed %{commit_timeago}":["由 %{commit_author_link} 提交於 %{commit_timeago}"],"About auto deploy":["關於自動部署"],"Active":["激活"],"Activity":["活動"],"Add Changelog":["添加變更日誌"],"Add Contribution guide":["添加貢獻指南"],"Add License":["添加許可證"],"Add an SSH key to your profile to pull or push via SSH.":["新增壹個用於推送或拉取的 SSH 秘鑰到您的個人賬戶中。"],"Add new directory":["添加新目錄"],"Archived project! Repository is read-only":["歸檔項目!存儲庫為只讀"],"Are you sure you want to delete this pipeline schedule?":["您確定要刪除此流水線計劃嗎?"],"Attach a file by drag & drop or %{upload_link}":["拖放文件到此處或者 %{upload_link}"],"Branch":["分支"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["分支 %{branch_name} 已創建。如要設置自動部署, 請選擇合適的 GitLab CI Yaml 模板併提交更改。%{link_to_autodeploy_doc}"],"Branches":["分支"],"Browse files":["瀏覽文件"],"ByAuthor|by":["作者:"],"CI configuration":["CI 配置"],"Cancel":["取消"],"ChangeTypeActionLabel|Pick into branch":["挑選到分支"],"ChangeTypeActionLabel|Revert in branch":["還原分支"],"ChangeTypeAction|Cherry-pick":["優選"],"ChangeType|commit":["提交"],"ChangeType|merge request":["合併請求"],"Changelog":["變更日誌"],"Charts":["統計圖"],"Cherry-pick this commit":["優選此提交"],"Cherry-pick this merge-request":["優選此合併請求"],"CiStatusLabel|canceled":["已取消"],"CiStatusLabel|created":["已創建"],"CiStatusLabel|failed":["已失敗"],"CiStatusLabel|manual action":["手動操作"],"CiStatusLabel|passed":["已通過"],"CiStatusLabel|passed with warnings":["已通過但有警告"],"CiStatusLabel|pending":["等待中"],"CiStatusLabel|skipped":["已跳過"],"CiStatusLabel|waiting for manual action":["等待手動操作"],"CiStatusText|blocked":["已阻塞"],"CiStatusText|canceled":["已取消"],"CiStatusText|created":["已創建"],"CiStatusText|failed":["已失敗"],"CiStatusText|manual":["待手動"],"CiStatusText|passed":["已通過"],"CiStatusText|pending":["等待中"],"CiStatusText|skipped":["已跳過"],"CiStatus|running":["運行中"],"Commit":["提交"],"Commit message":["提交信息"],"CommitMessage|Add %{file_name}":["添加 %{file_name}"],"Commits":["提交"],"Commits|History":["歷史"],"Committed by":["作者:"],"Compare":["比較"],"Contribution guide":["貢獻指南"],"Contributors":["貢獻者"],"Copy URL to clipboard":["複製URL到剪貼板"],"Copy commit SHA to clipboard":["複製提交 SHA 到剪貼板"],"Create New Directory":["創建新目錄"],"Create directory":["創建目錄"],"Create empty bare repository":["創建空的存儲庫"],"Create merge request":["創建合併請求"],"Create new...":["創建..."],"CreateNewFork|Fork":["派生"],"CreateTag|Tag":["標簽"],"Cron Timezone":["Cron 時區"],"Cron syntax":["Cron 語法"],"Custom":["自定義"],"Custom notification events":["自定義通知事件"],"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}.":["自定義通知級別與參與級別相同。使用自定義通知級別,您只能收到所選定事件通知。想瞭解更多信息,請查看 %{notification_link}."],"Cycle Analytics":["週期分析"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Define a custom pattern with cron syntax":["使用 Cron 語法定義自定義模式"],"Delete":["刪除"],"Deploy":["部署"],"Description":["描述"],"Directory name":["目錄名稱"],"Don't show again":["不再顯示"],"Download":["下載"],"Download tar":["下載 tar"],"Download tar.bz2":["下載 tar.bz2"],"Download tar.gz":["下載 tar.gz"],"Download zip":["下載 zip"],"DownloadArtifacts|Download":["下載"],"DownloadCommit|Email Patches":["電子郵件補丁"],"DownloadCommit|Plain Diff":["Diff 文件"],"DownloadSource|Download":["下載"],"Edit":["編輯"],"Edit Pipeline Schedule %{id}":["編輯 %{id} 流水線計劃"],"Every day (at 4:00am)":["每天(淩晨4點)"],"Every month (on the 1st at 4:00am)":["每月1日(淩晨4點)"],"Every week (Sundays at 4:00am)":["每周日(淩晨4點)"],"Failed to change the owner":["無法變更所有者"],"Failed to remove the pipeline schedule":["無法刪除流水線計劃"],"Files":["文件"],"Find by path":["按路徑查找"],"Find file":["查找文件"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"Fork":["派生"],"ForkedFromProjectPath|Forked from":["派生自"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Go to your fork":["跳轉到您的派生項目"],"GoToYourFork|Fork":["跳轉到您的派生項目"],"Home":["首頁"],"Housekeeping successfully started":["已開始維護"],"Import repository":["導入存儲庫"],"Interval Pattern":["間隔模式"],"Introducing Cycle Analytics":["週期分析簡介"],"LFSStatus|Disabled":["禁用"],"LFSStatus|Enabled":["啟用"],"Last %d day":["最後 %d 天"],"Last Pipeline":["最新流水線"],"Last Update":["最後更新"],"Last commit":["最後提交"],"Learn more in the":["了解更多"],"Leave group":["離開群組"],"Leave project":["離開項目"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"MissingSSHKeyWarningLink|add an SSH key":["添加壹個 SSH 公鑰"],"New Issue":["新議題"],"New Pipeline Schedule":["創建流水線計劃"],"New branch":["新分支"],"New directory":["新增目錄"],"New file":["新增文件"],"New issue":["新議題"],"New merge request":["新合併請求"],"New schedule":["新计划"],"New snippet":["新代碼片段"],"New tag":["新標籤"],"No repository":["沒有存儲庫"],"No schedules":["沒有計劃"],"Not available":["不可用"],"Not enough data":["數據不足"],"Notification events":["通知事件"],"NotificationEvent|Close issue":["關閉議題"],"NotificationEvent|Close merge request":["關閉合併請求"],"NotificationEvent|Failed pipeline":["流水線失敗"],"NotificationEvent|Merge merge request":["合併請求被合併"],"NotificationEvent|New issue":["新議題"],"NotificationEvent|New merge request":["新合併請求"],"NotificationEvent|New note":["新評論"],"NotificationEvent|Reassign issue":["重新指派議題"],"NotificationEvent|Reassign merge request":["重新指派合併請求"],"NotificationEvent|Reopen issue":["重新打開議題"],"NotificationEvent|Successful pipeline":["流水線成功完成"],"NotificationLevel|Custom":["自定義"],"NotificationLevel|Disabled":["禁用"],"NotificationLevel|Global":["全局"],"NotificationLevel|On mention":["提及"],"NotificationLevel|Participate":["參與"],"NotificationLevel|Watch":["關注"],"OfSearchInADropdown|Filter":["篩選"],"OpenedNDaysAgo|Opened":["開始於"],"Options":["選項"],"Owner":["所有者"],"Pipeline":["流水線"],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":["流水線計劃"],"Pipeline Schedules":["流水線計劃"],"PipelineSchedules|Activated":["已激活"],"PipelineSchedules|Active":["激活"],"PipelineSchedules|All":["所有"],"PipelineSchedules|Inactive":["等待"],"PipelineSchedules|Next Run":["下壹個運行"],"PipelineSchedules|None":["無"],"PipelineSchedules|Provide a short description for this pipeline":["為此流水線提供簡短描述"],"PipelineSchedules|Take ownership":["取得所有權"],"PipelineSchedules|Target":["目標"],"Project '%{project_name}' queued for deletion.":["項目 '%{project_name}' 已進入刪除隊列。"],"Project '%{project_name}' was successfully created.":["項目 '%{project_name}' 已創建完成。"],"Project '%{project_name}' was successfully updated.":["項目 '%{project_name}' 已更新完成。"],"Project '%{project_name}' will be deleted.":["項目 '%{project_name}' 已刪除。"],"Project access must be granted explicitly to each user.":["項目訪問權限必須明確授權給每個用戶。"],"Project export could not be deleted.":["無法刪除項目導出。"],"Project export has been deleted.":["項目導出已刪除。"],"Project export link has expired. Please generate a new export from your project settings.":["項目導出鏈接已過期。請從項目設置中重新生成項目導出。"],"Project export started. A download link will be sent by email.":["項目導出已開始。下載鏈接將通過電子郵件發送。"],"Project home":["項目首頁"],"ProjectFeature|Disabled":["禁用"],"ProjectFeature|Everyone with access":["任何人都可訪問"],"ProjectFeature|Only team members":["只有團隊成員"],"ProjectFileTree|Name":["名稱"],"ProjectLastActivity|Never":["從未"],"ProjectLifecycle|Stage":["階段"],"ProjectNetworkGraph|Graph":["分支圖"],"Read more":["了解更多"],"Readme":["自述文件"],"RefSwitcher|Branches":["分支"],"RefSwitcher|Tags":["標籤"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合併請求"],"Remind later":["稍後提醒"],"Remove project":["刪除項目"],"Request Access":["申請訪問"],"Revert this commit":["還原此提交"],"Revert this merge-request":["還原此合併請求"],"Save pipeline schedule":["保存流水線計劃"],"Schedule a new pipeline":["新增流水線計劃"],"Scheduling Pipelines":["流水線計劃"],"Search branches and tags":["搜索分支和標籤"],"Select Archive Format":["選擇下載格式"],"Select a timezone":["選擇時區"],"Select target branch":["選擇目標分支"],"Set a password on your account to pull or push via %{protocol}":["為您的賬戶添加壹個用於推送或拉取的 %{protocol} 密碼。"],"Set up CI":["設置 CI"],"Set up Koding":["設置 Koding"],"Set up auto deploy":["設置自動部署"],"SetPasswordToCloneLink|set a password":["設置密碼"],"Showing %d event":["顯示 %d 個事件"],"Source code":["源代碼"],"StarProject|Star":["星標"],"Start a new merge request with these changes":["包含這些更改到 新合併請求"],"Switch branch/tag":["切換分支/標籤"],"Tag":["標籤"],"Tags":["標籤"],"Target Branch":["目標分支"],"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.":["編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"The fork relationship has been removed.":["派生關係已被刪除。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建壹個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["流水線計劃會針對特定的分支或標簽在以後重復運行流水線。這些預定的流水線將根據其相關用戶繼承有限的項目訪問。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"The project can be accessed by any logged in user.":["該項目允許已登錄的用戶訪問。"],"The project can be accessed without any authentication.":["該項目允許任何人訪問。"],"The repository for this project does not exist.":["此項目的存儲庫不存在。"],"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.":["評審階段概述了從創建合併請求到合併的時間。當創建第壹個合併請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"This means you can not push code until you create an empty repository or import existing one.":["在創建壹個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合併或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Timeago|%s days ago":["%s 天前"],"Timeago|%s days remaining":["剩餘 %s 天"],"Timeago|%s hours remaining":["剩餘 %s 小時"],"Timeago|%s minutes ago":["%s 分鐘前"],"Timeago|%s minutes remaining":["剩餘 %s 分鐘"],"Timeago|%s months ago":["%s 個月前"],"Timeago|%s months remaining":["剩餘 %s 月"],"Timeago|%s seconds remaining":["剩餘 %s 秒"],"Timeago|%s weeks ago":["%s 星期前"],"Timeago|%s weeks remaining":["剩餘 %s 星期"],"Timeago|%s years ago":["%s 年前"],"Timeago|%s years remaining":["剩餘 %s 年"],"Timeago|1 day remaining":["剩餘 1 天"],"Timeago|1 hour remaining":["剩餘 1 小時"],"Timeago|1 minute remaining":["剩餘 1 分鐘"],"Timeago|1 month remaining":["剩餘 1 個月"],"Timeago|1 week remaining":["剩餘 1 星期"],"Timeago|1 year remaining":["剩餘 1 年"],"Timeago|Past due":["逾期"],"Timeago|a day ago":["1 天前"],"Timeago|a month ago":["1 個月前"],"Timeago|a week ago":["1 星期前"],"Timeago|a while":["剛剛"],"Timeago|a year ago":["1 年前"],"Timeago|about %s hours ago":["大約 %s 小時前"],"Timeago|about a minute ago":["大約 1 分鐘前"],"Timeago|about an hour ago":["大約 1 小時前"],"Timeago|in %s days":["在 %s 天"],"Timeago|in %s hours":["在 %s 小時"],"Timeago|in %s minutes":["在 %s 分鐘"],"Timeago|in %s months":["在 %s 個月"],"Timeago|in %s seconds":["在 %s 秒"],"Timeago|in %s weeks":["在 %s 星期"],"Timeago|in %s years":["在 %s 年"],"Timeago|in 1 day":["在 1 天"],"Timeago|in 1 hour":["在 1 小時"],"Timeago|in 1 minute":["在 1 分鐘"],"Timeago|in 1 month":["在 1 月"],"Timeago|in 1 week":["在 1 星期"],"Timeago|in 1 year":["在 1 年"],"Timeago|less than a minute ago":["不到 1 分鐘前"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Unstar":["取消星標"],"Upload New File":["上傳新文件"],"Upload file":["上傳文件"],"Use your global notification setting":["使用全局通知設置"],"VisibilityLevel|Internal":["內部"],"VisibilityLevel|Private":["私有"],"VisibilityLevel|Public":["公開"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"Withdraw Access Request":["取消訪問請求"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["您將要刪除 %{project_name_with_namespace}。\\n已刪除的項目無法恢復!\\n您確定繼續嗎?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["您將刪除與源項目 %{forked_from_project} 的派生關系。您確定繼續嗎?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["將 %{project_name_with_namespace} 轉義給另壹個所有者。您確定繼續嗎?"],"You can only add files when you are on a branch":["您只能在分支上添加文件"],"You must sign in to star a project":["您必須登錄才能對項目加星標"],"You need permission.":["您需要相關的權限。"],"You will not get any notifications via email":["您將不會收到任何通知郵件"],"You will only receive notifications for the events you choose":["您只會收到您選擇的事件通知"],"You will only receive notifications for threads you have participated in":["您只會收到您參與的主題的通知"],"You will receive notifications for any activity":["您將不會收到任何通知"],"You will receive notifications only for comments in which you were @mentioned":["您只會收到評論中提及(@)您的通知"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["在您的賬戶上 %{set_password_link} 之前, 您將無法通過 %{protocol} 拉取或推送代碼。"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["在您的個人資料中添加 %{add_ssh_key_link} 之前, 您將無法通過 SSH 拉取或推送代碼。"],"Your name":["您的名字"],"day":["天"],"notification emails":["通知郵件"],"parent":["父級"],"pipeline schedules documentation":["流水線計劃文檔"],"with stage":["於階段"]}}}; \ No newline at end of file +var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-13 04:07-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"%{commit_author_link} committed %{commit_timeago}":["由 %{commit_author_link} 提交於 %{commit_timeago}"],"About auto deploy":["關於自動部署"],"Active":["激活"],"Activity":["活動"],"Add Changelog":["添加變更日誌"],"Add Contribution guide":["添加貢獻指南"],"Add License":["添加許可證"],"Add an SSH key to your profile to pull or push via SSH.":["新增壹個用於推送或拉取的 SSH 秘鑰到賬號中。"],"Add new directory":["添加新目錄"],"Archived project! Repository is read-only":["歸檔項目!存儲庫為只讀"],"Are you sure you want to delete this pipeline schedule?":["您確定要刪除此流水線計劃嗎?"],"Attach a file by drag & drop or %{upload_link}":["拖放文件到此處或者 %{upload_link}"],"Branch":["分支"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["分支 %{branch_name} 已創建。如要設置自動部署, 請選擇合適的 GitLab CI Yaml 模板併提交更改。%{link_to_autodeploy_doc}"],"Branches":["分支"],"Browse files":["瀏覽文件"],"ByAuthor|by":["作者:"],"CI configuration":["CI 配置"],"Cancel":["取消"],"ChangeTypeActionLabel|Pick into branch":["挑選到分支"],"ChangeTypeActionLabel|Revert in branch":["還原分支"],"ChangeTypeAction|Cherry-pick":["優選"],"ChangeType|commit":["提交"],"ChangeType|merge request":["合併請求"],"Changelog":["變更日誌"],"Charts":["統計圖"],"Cherry-pick this commit":["優選此提交"],"Cherry-pick this merge-request":["優選此合併請求"],"CiStatusLabel|canceled":["已取消"],"CiStatusLabel|created":["已創建"],"CiStatusLabel|failed":["已失敗"],"CiStatusLabel|manual action":["手動操作"],"CiStatusLabel|passed":["已通過"],"CiStatusLabel|passed with warnings":["已通過但有警告"],"CiStatusLabel|pending":["等待中"],"CiStatusLabel|skipped":["已跳過"],"CiStatusLabel|waiting for manual action":["等待手動操作"],"CiStatusText|blocked":["已阻塞"],"CiStatusText|canceled":["已取消"],"CiStatusText|created":["已創建"],"CiStatusText|failed":["已失敗"],"CiStatusText|manual":["待手動"],"CiStatusText|passed":["已通過"],"CiStatusText|pending":["等待中"],"CiStatusText|skipped":["已跳過"],"CiStatus|running":["運行中"],"Commit":["提交"],"Commit message":["提交信息"],"CommitMessage|Add %{file_name}":["添加 %{file_name}"],"Commits":["提交"],"Commits|History":["歷史"],"Committed by":["作者:"],"Compare":["比較"],"Contribution guide":["貢獻指南"],"Contributors":["貢獻者"],"Copy URL to clipboard":["複製URL到剪貼板"],"Copy commit SHA to clipboard":["複製提交 SHA 到剪貼板"],"Create New Directory":["創建新目錄"],"Create directory":["創建目錄"],"Create empty bare repository":["創建空的存儲庫"],"Create merge request":["創建合併請求"],"Create new...":["創建..."],"CreateNewFork|Fork":["派生"],"CreateTag|Tag":["標簽"],"Cron Timezone":["Cron 時區"],"Cron syntax":["Cron 語法"],"Custom":["自定義"],"Custom notification events":["自定義通知事件"],"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}.":["自定義通知級別繼承自參與級別。使用自定義通知級別,您會收到參與級別及選定事件的通知。想了解更多信息,請查看 %{notification_link}."],"Cycle Analytics":["週期分析"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Define a custom pattern with cron syntax":["使用 Cron 語法定義自定義模式"],"Delete":["刪除"],"Deploy":["部署"],"Description":["描述"],"Directory name":["目錄名稱"],"Don't show again":["不再顯示"],"Download":["下載"],"Download tar":["下載 tar"],"Download tar.bz2":["下載 tar.bz2"],"Download tar.gz":["下載 tar.gz"],"Download zip":["下載 zip"],"DownloadArtifacts|Download":["下載"],"DownloadCommit|Email Patches":["電子郵件補丁"],"DownloadCommit|Plain Diff":["Diff 文件"],"DownloadSource|Download":["下載"],"Edit":["編輯"],"Edit Pipeline Schedule %{id}":["編輯 %{id} 流水線計劃"],"Every day (at 4:00am)":["每天(淩晨4點)"],"Every month (on the 1st at 4:00am)":["每月1日(淩晨4點)"],"Every week (Sundays at 4:00am)":["每周日(淩晨4點)"],"Failed to change the owner":["無法變更所有者"],"Failed to remove the pipeline schedule":["無法刪除流水線計劃"],"Files":["文件"],"Find by path":["按路徑查找"],"Find file":["查找文件"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"Fork":["派生"],"ForkedFromProjectPath|Forked from":["派生自"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Go to your fork":["跳轉到派生項目"],"GoToYourFork|Fork":["跳轉到派生項目"],"Home":["首頁"],"Housekeeping successfully started":["已開始維護"],"Import repository":["導入存儲庫"],"Interval Pattern":["間隔模式"],"Introducing Cycle Analytics":["週期分析簡介"],"LFSStatus|Disabled":["停用"],"LFSStatus|Enabled":["啟用"],"Last %d day":["最後 %d 天"],"Last Pipeline":["最新流水線"],"Last Update":["最後更新"],"Last commit":["最後提交"],"Learn more in the":["了解更多"],"Leave group":["離開群組"],"Leave project":["離開項目"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"MissingSSHKeyWarningLink|add an SSH key":["添加壹個 SSH 公鑰"],"New Issue":["新議題"],"New Pipeline Schedule":["創建流水線計劃"],"New branch":["新分支"],"New directory":["新增目錄"],"New file":["新增文件"],"New issue":["新議題"],"New merge request":["新合併請求"],"New schedule":["新计划"],"New snippet":["新代碼片段"],"New tag":["新標籤"],"No repository":["沒有存儲庫"],"No schedules":["沒有計劃"],"Not available":["不可用"],"Not enough data":["數據不足"],"Notification events":["通知事件"],"NotificationEvent|Close issue":["關閉議題"],"NotificationEvent|Close merge request":["關閉合併請求"],"NotificationEvent|Failed pipeline":["流水線失敗"],"NotificationEvent|Merge merge request":["合併請求被合併"],"NotificationEvent|New issue":["新議題"],"NotificationEvent|New merge request":["新合併請求"],"NotificationEvent|New note":["新評論"],"NotificationEvent|Reassign issue":["重新指派議題"],"NotificationEvent|Reassign merge request":["重新指派合併請求"],"NotificationEvent|Reopen issue":["重新打開議題"],"NotificationEvent|Successful pipeline":["流水線成功完成"],"NotificationLevel|Custom":["自定義"],"NotificationLevel|Disabled":["停用"],"NotificationLevel|Global":["全局"],"NotificationLevel|On mention":["提及"],"NotificationLevel|Participate":["參與"],"NotificationLevel|Watch":["關注"],"OfSearchInADropdown|Filter":["篩選"],"OpenedNDaysAgo|Opened":["開始於"],"Options":["選項"],"Owner":["所有者"],"Pipeline":["流水線"],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":["流水線計劃"],"Pipeline Schedules":["流水線計劃"],"PipelineSchedules|Activated":["已激活"],"PipelineSchedules|Active":["激活"],"PipelineSchedules|All":["所有"],"PipelineSchedules|Inactive":["等待"],"PipelineSchedules|Next Run":["下壹個運行"],"PipelineSchedules|None":["無"],"PipelineSchedules|Provide a short description for this pipeline":["為此流水線提供簡短描述"],"PipelineSchedules|Take ownership":["取得所有權"],"PipelineSchedules|Target":["目標"],"Project '%{project_name}' queued for deletion.":["項目 '%{project_name}' 已進入刪除隊列。"],"Project '%{project_name}' was successfully created.":["項目 '%{project_name}' 已創建完成。"],"Project '%{project_name}' was successfully updated.":["項目 '%{project_name}' 已更新完成。"],"Project '%{project_name}' will be deleted.":["項目 '%{project_name}' 已刪除。"],"Project access must be granted explicitly to each user.":["項目訪問權限必須明確授權給每個用戶。"],"Project export could not be deleted.":["無法刪除項目導出。"],"Project export has been deleted.":["項目導出已刪除。"],"Project export link has expired. Please generate a new export from your project settings.":["項目導出鏈接已過期。請從項目設置中重新生成項目導出。"],"Project export started. A download link will be sent by email.":["項目導出已開始。下載鏈接將通過電子郵件發送。"],"Project home":["項目首頁"],"ProjectFeature|Disabled":["停用"],"ProjectFeature|Everyone with access":["任何人都可訪問"],"ProjectFeature|Only team members":["只有團隊成員"],"ProjectFileTree|Name":["名稱"],"ProjectLastActivity|Never":["從未"],"ProjectLifecycle|Stage":["階段"],"ProjectNetworkGraph|Graph":["分支圖"],"Read more":["了解更多"],"Readme":["自述文件"],"RefSwitcher|Branches":["分支"],"RefSwitcher|Tags":["標籤"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合併請求"],"Remind later":["稍後提醒"],"Remove project":["刪除項目"],"Request Access":["申請訪問"],"Revert this commit":["還原此提交"],"Revert this merge-request":["還原此合併請求"],"Save pipeline schedule":["保存流水線計劃"],"Schedule a new pipeline":["新增流水線計劃"],"Scheduling Pipelines":["流水線計劃"],"Search branches and tags":["搜索分支和標籤"],"Select Archive Format":["選擇下載格式"],"Select a timezone":["選擇時區"],"Select target branch":["選擇目標分支"],"Set a password on your account to pull or push via %{protocol}":["為賬號添加壹個用於推送或拉取的 %{protocol} 密碼。"],"Set up CI":["設置 CI"],"Set up Koding":["設置 Koding"],"Set up auto deploy":["設置自動部署"],"SetPasswordToCloneLink|set a password":["設置密碼"],"Showing %d event":["顯示 %d 個事件"],"Source code":["源代碼"],"StarProject|Star":["星標"],"Start a new merge request with these changes":["包含這些更改到 新合併請求"],"Switch branch/tag":["切換分支/標籤"],"Tag":["標籤"],"Tags":["標籤"],"Target Branch":["目標分支"],"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.":["編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"The fork relationship has been removed.":["派生關係已被刪除。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建壹個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["流水線計劃會針對特定的分支或標簽在以後重復運行流水線。這些預定的流水線將根據其相關用戶繼承有限的項目訪問。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"The project can be accessed by any logged in user.":["該項目允許已登錄的用戶訪問。"],"The project can be accessed without any authentication.":["該項目允許任何人訪問。"],"The repository for this project does not exist.":["此項目的存儲庫不存在。"],"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.":["評審階段概述了從創建合併請求到合併的時間。當創建第壹個合併請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"This means you can not push code until you create an empty repository or import existing one.":["在創建壹個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合併或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Timeago|%s days ago":["%s 天前"],"Timeago|%s days remaining":["剩餘 %s 天"],"Timeago|%s hours remaining":["剩餘 %s 小時"],"Timeago|%s minutes ago":["%s 分鐘前"],"Timeago|%s minutes remaining":["剩餘 %s 分鐘"],"Timeago|%s months ago":["%s 個月前"],"Timeago|%s months remaining":["剩餘 %s 月"],"Timeago|%s seconds remaining":["剩餘 %s 秒"],"Timeago|%s weeks ago":["%s 星期前"],"Timeago|%s weeks remaining":["剩餘 %s 星期"],"Timeago|%s years ago":["%s 年前"],"Timeago|%s years remaining":["剩餘 %s 年"],"Timeago|1 day remaining":["剩餘 1 天"],"Timeago|1 hour remaining":["剩餘 1 小時"],"Timeago|1 minute remaining":["剩餘 1 分鐘"],"Timeago|1 month remaining":["剩餘 1 個月"],"Timeago|1 week remaining":["剩餘 1 星期"],"Timeago|1 year remaining":["剩餘 1 年"],"Timeago|Past due":["逾期"],"Timeago|a day ago":["1 天前"],"Timeago|a month ago":["1 個月前"],"Timeago|a week ago":["1 星期前"],"Timeago|a while":["剛剛"],"Timeago|a year ago":["1 年前"],"Timeago|about %s hours ago":["大約 %s 小時前"],"Timeago|about a minute ago":["大約 1 分鐘前"],"Timeago|about an hour ago":["大約 1 小時前"],"Timeago|in %s days":["在 %s 天"],"Timeago|in %s hours":["在 %s 小時"],"Timeago|in %s minutes":["在 %s 分鐘"],"Timeago|in %s months":["在 %s 個月"],"Timeago|in %s seconds":["在 %s 秒"],"Timeago|in %s weeks":["在 %s 星期"],"Timeago|in %s years":["在 %s 年"],"Timeago|in 1 day":["在 1 天"],"Timeago|in 1 hour":["在 1 小時"],"Timeago|in 1 minute":["在 1 分鐘"],"Timeago|in 1 month":["在 1 月"],"Timeago|in 1 week":["在 1 星期"],"Timeago|in 1 year":["在 1 年"],"Timeago|less than a minute ago":["不到 1 分鐘前"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Unstar":["取消星標"],"Upload New File":["上傳新文件"],"Upload file":["上傳文件"],"Use your global notification setting":["使用全局通知設置"],"VisibilityLevel|Internal":["內部"],"VisibilityLevel|Private":["私有"],"VisibilityLevel|Public":["公開"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"Withdraw Access Request":["取消訪問請求"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["您將要刪除 %{project_name_with_namespace}。\\n已刪除的項目無法恢復!\\n您確定繼續嗎?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["您將刪除與源項目 %{forked_from_project} 的派生關系。您確定繼續嗎?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["將 %{project_name_with_namespace} 轉義給另壹個所有者。您確定繼續嗎?"],"You can only add files when you are on a branch":["您只能在分支上添加文件"],"You must sign in to star a project":["您必須登錄才能對項目加星標"],"You need permission.":["您需要相關的權限。"],"You will not get any notifications via email":["您將不會收到任何通知郵件"],"You will only receive notifications for the events you choose":["您只會收到您選擇的事件通知"],"You will only receive notifications for threads you have participated in":["您只會收到您參與的主題的通知"],"You will receive notifications for any activity":["您將不會收到任何通知"],"You will receive notifications only for comments in which you were @mentioned":["您只會收到評論中提及(@)您的通知"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["在賬號上 %{set_password_link} 之前將無法通過 %{protocol} 拉取或推送代碼。"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["在賬號中添加 %{add_ssh_key_link} 之前您將無法通過 SSH 拉取或推送代碼。"],"Your name":["您的名字"],"day":["天"],"notification emails":["通知郵件"],"parent":["父級"],"pipeline schedules documentation":["流水線計劃文檔"],"with stage":["於階段"]}}}; \ No newline at end of file diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po index 22fe5e4f807..8fbc38ba5af 100644 --- a/locale/zh_HK/gitlab.po +++ b/locale/zh_HK/gitlab.po @@ -7,7 +7,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-12 11:08-0400\n" +"PO-Revision-Date: 2017-06-13 04:07-0400\n" "Last-Translator: Huang Tao \n" "Language-Team: Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)\n" "Language: zh-HK\n" @@ -36,7 +36,7 @@ msgid "Add License" msgstr "添加許可證" msgid "Add an SSH key to your profile to pull or push via SSH." -msgstr "新增壹個用於推送或拉取的 SSH 秘鑰到您的個人賬戶中。" +msgstr "新增壹個用於推送或拉取的 SSH 秘鑰到賬號中。" msgid "Add new directory" msgstr "添加新目錄" @@ -230,7 +230,7 @@ msgid "" "notification levels you will also receive notifications for select events. " "To find out more, check out %{notification_link}." msgstr "" -"自定義通知級別與參與級別相同。使用自定義通知級別,您只能收到所選定事件通知。想瞭解更多信息,請查看 %{notification_link}." +"自定義通知級別繼承自參與級別。使用自定義通知級別,您會收到參與級別及選定事件的通知。想了解更多信息,請查看 %{notification_link}." msgid "Cycle Analytics" msgstr "週期分析" @@ -357,10 +357,10 @@ msgid "From merge request merge until deploy to production" msgstr "從合併請求的合併到部署至生產環境" msgid "Go to your fork" -msgstr "跳轉到您的派生項目" +msgstr "跳轉到派生項目" msgid "GoToYourFork|Fork" -msgstr "跳轉到您的派生項目" +msgstr "跳轉到派生項目" msgid "Home" msgstr "首頁" @@ -378,7 +378,7 @@ msgid "Introducing Cycle Analytics" msgstr "週期分析簡介" msgid "LFSStatus|Disabled" -msgstr "禁用" +msgstr "停用" msgid "LFSStatus|Enabled" msgstr "啟用" @@ -498,7 +498,7 @@ msgid "NotificationLevel|Custom" msgstr "自定義" msgid "NotificationLevel|Disabled" -msgstr "禁用" +msgstr "停用" msgid "NotificationLevel|Global" msgstr "全局" @@ -596,7 +596,7 @@ msgid "Project home" msgstr "項目首頁" msgid "ProjectFeature|Disabled" -msgstr "禁用" +msgstr "停用" msgid "ProjectFeature|Everyone with access" msgstr "任何人都可訪問" @@ -683,7 +683,7 @@ msgid "Select target branch" msgstr "選擇目標分支" msgid "Set a password on your account to pull or push via %{protocol}" -msgstr "為您的賬戶添加壹個用於推送或拉取的 %{protocol} 密碼。" +msgstr "為賬號添加壹個用於推送或拉取的 %{protocol} 密碼。" msgid "Set up CI" msgstr "設置 CI" @@ -1033,12 +1033,12 @@ msgstr "您只會收到評論中提及(@)您的通知" msgid "" "You won't be able to pull or push project code via %{protocol} until you " "%{set_password_link} on your account" -msgstr "在您的賬戶上 %{set_password_link} 之前, 您將無法通過 %{protocol} 拉取或推送代碼。" +msgstr "在賬號上 %{set_password_link} 之前將無法通過 %{protocol} 拉取或推送代碼。" msgid "" "You won't be able to pull or push project code via SSH until you " "%{add_ssh_key_link} to your profile" -msgstr "在您的個人資料中添加 %{add_ssh_key_link} 之前, 您將無法通過 SSH 拉取或推送代碼。" +msgstr "在賬號中添加 %{add_ssh_key_link} 之前您將無法通過 SSH 拉取或推送代碼。" msgid "Your name" msgstr "您的名字" diff --git a/locale/zh_HK/gitlab.po.time_stamp b/locale/zh_HK/gitlab.po.time_stamp index 0519ecba6ea..e69de29bb2d 100644 --- a/locale/zh_HK/gitlab.po.time_stamp +++ b/locale/zh_HK/gitlab.po.time_stamp @@ -1 +0,0 @@ - \ No newline at end of file From ba822380045529cdffb78f27db02c14625a4b70c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Mon, 12 Jun 2017 13:22:33 +0800 Subject: [PATCH 0070/1380] supplement bulgarian translation Fix #33561 --- app/assets/javascripts/locale/bg/app.js | 2 +- locale/bg/gitlab.po | 103 ++++++++++++++++++++++-- locale/bg/gitlab.po.time_stamp | 1 + 3 files changed, 100 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/locale/bg/app.js b/app/assets/javascripts/locale/bg/app.js index ba56c0bea25..f1fedb546de 100644 --- a/app/assets/javascripts/locale/bg/app.js +++ b/app/assets/javascripts/locale/bg/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-05-04 19:24-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-05 09:40-0400","Last-Translator":"Lyubomir Vasilev ","Language-Team":"Bulgarian","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"ByAuthor|by":["от"],"Commit":["Подаване","Подавания"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Deploy":["Внедряване","Внедрявания"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Introducing Cycle Analytics":["Представяме Ви анализът на циклите"],"Last %d day":["Последния %d ден","Последните %d дни"],"Limited to showing %d event at most":["Ограничено до показване на последното %d събитие","Ограничено до показване на последните %d събития"],"Median":["Медиана"],"New Issue":["Нов проблем","Нови проблема"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"OpenedNDaysAgo|Opened":["Отворен"],"Pipeline Health":["Състояние"],"ProjectLifecycle|Stage":["Етап"],"Read more":["Прочетете повече"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани задачи за внедряване"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"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.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"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.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"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.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия."],"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.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"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.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"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.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всички задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнените на първата Ви такава задача."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"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.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"You need permission.":["Нуждаете се от разрешение."],"day":["ден","дни"]}}}; \ No newline at end of file +var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-07 21:22+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-10 03:35-0400","Last-Translator":"Lyubomir Vasilev ","Language-Team":"Bulgarian","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"Are you sure you want to delete this pipeline schedule?":["Наистина ли искате да изтриете този план за схема?"],"ByAuthor|by":["от"],"Cancel":["Отказ"],"Commit":["Подаване","Подавания"],"Cron Timezone":["Часова зона за „Cron“"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Delete":["Изтриване"],"Deploy":["Внедряване","Внедрявания"],"Description":["Описание"],"Edit":["Редактиране"],"Edit Pipeline Schedule %{id}":["Редактиране на плана %{id} за схема"],"Failed to change the owner":["Собственикът не може да бъде променен"],"Failed to remove the pipeline schedule":["Планът за схема не може да бъде премахнат"],"Filter":["Филтриране"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Interval Pattern":["Шаблон за интервала"],"Introducing Cycle Analytics":["Представяме Ви анализа на циклите"],"Last %d day":["Последния %d ден","Последните %d дни"],"Last Pipeline":["Последна схема"],"Limited to showing %d event at most":["Ограничено до показване на последното %d събитие","Ограничено до показване на последните %d събития"],"Median":["Медиана"],"New Issue":["Нов проблем","Нови проблема"],"New Pipeline Schedule":["Нов план за схема"],"No schedules":["Няма планове"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"OpenedNDaysAgo|Opened":["Отворен"],"Owner":["Собственик"],"Pipeline Health":["Състояние"],"Pipeline Schedule":["План за схема"],"Pipeline Schedules":["Планове за схема"],"PipelineSchedules|Activated":["Включено"],"PipelineSchedules|Active":["Активно"],"PipelineSchedules|All":["Всички"],"PipelineSchedules|Inactive":["Неактивно"],"PipelineSchedules|Next Run":["Следващо изпълнение"],"PipelineSchedules|None":["Нищо"],"PipelineSchedules|Provide a short description for this pipeline":["Въведете кратко описание за тази схема"],"PipelineSchedules|Take ownership":["Поемане на собствеността"],"PipelineSchedules|Target":["Цел"],"ProjectLifecycle|Stage":["Етап"],"Read more":["Прочетете повече"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани задачи за внедряване"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Save pipeline schedule":["Запазване на плана за схема"],"Schedule a new pipeline":["Създаване на нов план за схема"],"Select a timezone":["Изберете часова зона"],"Select target branch":["Изберете целеви клон"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"Target Branch":["Целеви клон"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"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.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"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.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"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.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия."],"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.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"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.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"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.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнението на първата Ви схема."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"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.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"You need permission.":["Нуждаете се от разрешение."],"day":["ден","дни"]}}}; \ No newline at end of file diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po index e6caf83252d..41805a7792e 100644 --- a/locale/bg/gitlab.po +++ b/locale/bg/gitlab.po @@ -3,25 +3,34 @@ msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-05-04 19:24-0500\n" +"POT-Creation-Date: 2017-06-07 21:22+0200\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-05 09:40-0400\n" +"PO-Revision-Date: 2017-06-10 03:35-0400\n" "Last-Translator: Lyubomir Vasilev \n" "Language-Team: Bulgarian\n" "Language: bg\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +msgid "Are you sure you want to delete this pipeline schedule?" +msgstr "Наистина ли искате да изтриете този план за схема?" + msgid "ByAuthor|by" msgstr "от" +msgid "Cancel" +msgstr "Отказ" + msgid "Commit" msgid_plural "Commits" msgstr[0] "Подаване" msgstr[1] "Подавания" +msgid "Cron Timezone" +msgstr "Часова зона за „Cron“" + msgid "" "Cycle Analytics gives an overview of how much time it takes to go from idea " "to production in your project." @@ -50,11 +59,32 @@ msgstr "Подготовка за издаване" msgid "CycleAnalyticsStage|Test" msgstr "Тестване" +msgid "Delete" +msgstr "Изтриване" + msgid "Deploy" msgid_plural "Deploys" msgstr[0] "Внедряване" msgstr[1] "Внедрявания" +msgid "Description" +msgstr "Описание" + +msgid "Edit" +msgstr "Редактиране" + +msgid "Edit Pipeline Schedule %{id}" +msgstr "Редактиране на плана %{id} за схема" + +msgid "Failed to change the owner" +msgstr "Собственикът не може да бъде променен" + +msgid "Failed to remove the pipeline schedule" +msgstr "Планът за схема не може да бъде премахнат" + +msgid "Filter" +msgstr "Филтриране" + msgid "FirstPushedBy|First" msgstr "Първо" @@ -68,14 +98,20 @@ msgid "From merge request merge until deploy to production" msgstr "" "От прилагането на заявката за сливане до внедряването в крайната версия" +msgid "Interval Pattern" +msgstr "Шаблон за интервала" + msgid "Introducing Cycle Analytics" -msgstr "Представяме Ви анализът на циклите" +msgstr "Представяме Ви анализа на циклите" msgid "Last %d day" msgid_plural "Last %d days" msgstr[0] "Последния %d ден" msgstr[1] "Последните %d дни" +msgid "Last Pipeline" +msgstr "Последна схема" + msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" msgstr[0] "Ограничено до показване на последното %d събитие" @@ -89,6 +125,12 @@ msgid_plural "New Issues" msgstr[0] "Нов проблем" msgstr[1] "Нови проблема" +msgid "New Pipeline Schedule" +msgstr "Нов план за схема" + +msgid "No schedules" +msgstr "Няма планове" + msgid "Not available" msgstr "Не е налично" @@ -98,9 +140,45 @@ msgstr "Няма достатъчно данни" msgid "OpenedNDaysAgo|Opened" msgstr "Отворен" +msgid "Owner" +msgstr "Собственик" + msgid "Pipeline Health" msgstr "Състояние" +msgid "Pipeline Schedule" +msgstr "План за схема" + +msgid "Pipeline Schedules" +msgstr "Планове за схема" + +msgid "PipelineSchedules|Activated" +msgstr "Включено" + +msgid "PipelineSchedules|Active" +msgstr "Активно" + +msgid "PipelineSchedules|All" +msgstr "Всички" + +msgid "PipelineSchedules|Inactive" +msgstr "Неактивно" + +msgid "PipelineSchedules|Next Run" +msgstr "Следващо изпълнение" + +msgid "PipelineSchedules|None" +msgstr "Нищо" + +msgid "PipelineSchedules|Provide a short description for this pipeline" +msgstr "Въведете кратко описание за тази схема" + +msgid "PipelineSchedules|Take ownership" +msgstr "Поемане на собствеността" + +msgid "PipelineSchedules|Target" +msgstr "Цел" + msgid "ProjectLifecycle|Stage" msgstr "Етап" @@ -125,11 +203,26 @@ msgstr "Свързани заявки за сливане" msgid "Related Merged Requests" msgstr "Свързани приложени заявки за сливане" +msgid "Save pipeline schedule" +msgstr "Запазване на плана за схема" + +msgid "Schedule a new pipeline" +msgstr "Създаване на нов план за схема" + +msgid "Select a timezone" +msgstr "Изберете часова зона" + +msgid "Select target branch" +msgstr "Изберете целеви клон" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "Показване на %d събитие" msgstr[1] "Показване на %d събития" +msgid "Target Branch" +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 " @@ -197,8 +290,8 @@ msgid "" "first pipeline finishes running." msgstr "" "Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни " -"всички задачи за свързаната заявка за сливане. Данните ще бъдат добавени " -"автоматично след като приключи изпълнените на първата Ви такава задача." +"всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат " +"добавени автоматично след като приключи изпълнението на първата Ви схема." msgid "The time taken by each data entry gathered by that stage." msgstr "Времето, което отнема всеки запис от данни за съответния етап." diff --git a/locale/bg/gitlab.po.time_stamp b/locale/bg/gitlab.po.time_stamp index e69de29bb2d..0519ecba6ea 100644 --- a/locale/bg/gitlab.po.time_stamp +++ b/locale/bg/gitlab.po.time_stamp @@ -0,0 +1 @@ + \ No newline at end of file From b3c13e05fb8080ea1672caf4c0ae72ebc3b5222b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Mon, 12 Jun 2017 13:29:11 +0800 Subject: [PATCH 0071/1380] add changelog of supplement bulgarian translation --- .../33561-supplement_bulgarian_translation_of_i18n.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/33561-supplement_bulgarian_translation_of_i18n.yml diff --git a/changelogs/unreleased/33561-supplement_bulgarian_translation_of_i18n.yml b/changelogs/unreleased/33561-supplement_bulgarian_translation_of_i18n.yml new file mode 100644 index 00000000000..4f2ba2e1de3 --- /dev/null +++ b/changelogs/unreleased/33561-supplement_bulgarian_translation_of_i18n.yml @@ -0,0 +1,4 @@ +--- +title: Supplement Bulgarian translation of Project Page & Repository Page +merge_request: 12083 +author: Lyubomir Vasilev From 66774c7220d6d47e71df11a028c3cd4d1e5d8d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 13 Jun 2017 11:22:51 +0800 Subject: [PATCH 0072/1380] Optimization 'bg' translation 1. Fix missing translations --- app/assets/javascripts/locale/bg/app.js | 2 +- locale/bg/gitlab.po | 794 +++++++++++++++++++++++- 2 files changed, 786 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/locale/bg/app.js b/app/assets/javascripts/locale/bg/app.js index f1fedb546de..33a5c3c7eb9 100644 --- a/app/assets/javascripts/locale/bg/app.js +++ b/app/assets/javascripts/locale/bg/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-07 21:22+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-10 03:35-0400","Last-Translator":"Lyubomir Vasilev ","Language-Team":"Bulgarian","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"Are you sure you want to delete this pipeline schedule?":["Наистина ли искате да изтриете този план за схема?"],"ByAuthor|by":["от"],"Cancel":["Отказ"],"Commit":["Подаване","Подавания"],"Cron Timezone":["Часова зона за „Cron“"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Delete":["Изтриване"],"Deploy":["Внедряване","Внедрявания"],"Description":["Описание"],"Edit":["Редактиране"],"Edit Pipeline Schedule %{id}":["Редактиране на плана %{id} за схема"],"Failed to change the owner":["Собственикът не може да бъде променен"],"Failed to remove the pipeline schedule":["Планът за схема не може да бъде премахнат"],"Filter":["Филтриране"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Interval Pattern":["Шаблон за интервала"],"Introducing Cycle Analytics":["Представяме Ви анализа на циклите"],"Last %d day":["Последния %d ден","Последните %d дни"],"Last Pipeline":["Последна схема"],"Limited to showing %d event at most":["Ограничено до показване на последното %d събитие","Ограничено до показване на последните %d събития"],"Median":["Медиана"],"New Issue":["Нов проблем","Нови проблема"],"New Pipeline Schedule":["Нов план за схема"],"No schedules":["Няма планове"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"OpenedNDaysAgo|Opened":["Отворен"],"Owner":["Собственик"],"Pipeline Health":["Състояние"],"Pipeline Schedule":["План за схема"],"Pipeline Schedules":["Планове за схема"],"PipelineSchedules|Activated":["Включено"],"PipelineSchedules|Active":["Активно"],"PipelineSchedules|All":["Всички"],"PipelineSchedules|Inactive":["Неактивно"],"PipelineSchedules|Next Run":["Следващо изпълнение"],"PipelineSchedules|None":["Нищо"],"PipelineSchedules|Provide a short description for this pipeline":["Въведете кратко описание за тази схема"],"PipelineSchedules|Take ownership":["Поемане на собствеността"],"PipelineSchedules|Target":["Цел"],"ProjectLifecycle|Stage":["Етап"],"Read more":["Прочетете повече"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани задачи за внедряване"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Save pipeline schedule":["Запазване на плана за схема"],"Schedule a new pipeline":["Създаване на нов план за схема"],"Select a timezone":["Изберете часова зона"],"Select target branch":["Изберете целеви клон"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"Target Branch":["Целеви клон"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"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.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"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.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"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.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия."],"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.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"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.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"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.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнението на първата Ви схема."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"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.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"You need permission.":["Нуждаете се от разрешение."],"day":["ден","дни"]}}}; \ No newline at end of file +var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-12 09:36-0400","Last-Translator":"Lyubomir Vasilev ","Language-Team":"Bulgarian (https://translate.zanata.org/project/view/GitLab)","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"%{commit_author_link} committed %{commit_timeago}":[""],"About auto deploy":["Относно автоматичното внедряване"],"Active":[""],"Activity":["Дейност"],"Add Changelog":["Добавяне на списък с промени"],"Add Contribution guide":["Добавяне на ръководство за сътрудничество"],"Add License":["Добавяне на лиценз"],"Add an SSH key to your profile to pull or push via SSH.":["Добавете SSH ключ в профила си, за да можете да изтегляте или изпращате промени чрез SSH."],"Add new directory":["Добавяне на нова папка"],"Archived project! Repository is read-only":["Архивиран проект! Хранилището е само за четене"],"Are you sure you want to delete this pipeline schedule?":["Наистина ли искате да изтриете този план за схема?"],"Attach a file by drag & drop or %{upload_link}":[""],"Branch":["Клон","Клонове"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["Клонът %{branch_name} беше създаден. За да настроите автоматичното внедряване, изберете Yaml шаблон за GitLab CI и подайте промените си. %{link_to_autodeploy_doc}"],"Branches":["Клонове"],"Browse files":[""],"ByAuthor|by":["от"],"CI configuration":["Конфигурация на непрекъсната интеграция"],"Cancel":["Отказ"],"ChangeTypeActionLabel|Pick into branch":[""],"ChangeTypeActionLabel|Revert in branch":[""],"ChangeTypeAction|Cherry-pick":[""],"ChangeType|commit":[""],"ChangeType|merge request":[""],"Changelog":["Списък с промени"],"Charts":["Графики"],"Cherry-pick this commit":[""],"Cherry-pick this merge-request":[""],"CiStatusLabel|canceled":["отказано"],"CiStatusLabel|created":["създадено"],"CiStatusLabel|failed":["неуспешно"],"CiStatusLabel|manual action":["ръчно действие"],"CiStatusLabel|passed":["успешно"],"CiStatusLabel|passed with warnings":["успешно, с предупреждения"],"CiStatusLabel|pending":["на изчакване"],"CiStatusLabel|skipped":["пропуснато"],"CiStatusLabel|waiting for manual action":["чакане за ръчно действие"],"CiStatusText|blocked":["блокирано"],"CiStatusText|canceled":["отказано"],"CiStatusText|created":["създадено"],"CiStatusText|failed":["неуспешно"],"CiStatusText|manual":["ръчно"],"CiStatusText|passed":["успешно"],"CiStatusText|pending":["на изчакване"],"CiStatusText|skipped":["пропуснато"],"CiStatus|running":["протича в момента"],"Commit":["Подаване","Подавания"],"Commit message":[""],"CommitMessage|Add %{file_name}":["Добавяне на „%{file_name}“"],"Commits":["Подавания"],"Commits|History":["История"],"Committed by":[""],"Compare":["Сравнение"],"Contribution guide":["Ръководство за сътрудничество"],"Contributors":["Сътрудници"],"Copy URL to clipboard":["Копиране на адреса в буфера за обмен"],"Copy commit SHA to clipboard":["Копиране на идентификатора на подаването в буфера за обмен"],"Create New Directory":["Създаване на нова папка"],"Create directory":["Създаване на папка"],"Create empty bare repository":["Създаване на празно хранилище"],"Create merge request":["Създаване на заявка за сливане"],"Create new...":[""],"CreateNewFork|Fork":["Разклоняване"],"CreateTag|Tag":[""],"Cron Timezone":["Часова зона за „Cron“"],"Cron syntax":[""],"Custom":[""],"Custom notification events":["Персонализирани събития за известяване"],"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}.":["Персонализираните нива на известяване са същите като нивата за участие. С персонализираните нива на известяване ще можете да получавате и известия за избрани събития. За да научите повече, прегледайте %{notification_link}."],"Cycle Analytics":["Анализ на циклите"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Define a custom pattern with cron syntax":[""],"Delete":["Изтриване"],"Deploy":["Внедряване","Внедрявания"],"Description":["Описание"],"Directory name":["Име на папката"],"Don't show again":["Да не се показва повече"],"Download":["Сваляне"],"Download tar":["Сваляне във формат „tar“"],"Download tar.bz2":["Сваляне във формат „tar.bz2“"],"Download tar.gz":["Сваляне във формат „tar.gz“"],"Download zip":["Сваляне във формат „zip“"],"DownloadArtifacts|Download":["Сваляне"],"DownloadCommit|Email Patches":[""],"DownloadCommit|Plain Diff":[""],"DownloadSource|Download":["Сваляне"],"Edit":["Редактиране"],"Edit Pipeline Schedule %{id}":["Редактиране на плана %{id} за схема"],"Every day (at 4:00am)":[""],"Every month (on the 1st at 4:00am)":[""],"Every week (Sundays at 4:00am)":[""],"Failed to change the owner":["Собственикът не може да бъде променен"],"Failed to remove the pipeline schedule":["Планът за схема не може да бъде премахнат"],"Files":["Файлове"],"Find by path":["Търсене по път"],"Find file":["Търсене на файл"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"Fork":["Наследяване",""],"ForkedFromProjectPath|Forked from":["Разклонение на"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Go to your fork":["Към Вашето разклонение"],"GoToYourFork|Fork":["Разклонение"],"Home":["Начало"],"Housekeeping successfully started":["Освежаването започна успешно"],"Import repository":["Внасяне на хранилище"],"Interval Pattern":["Шаблон за интервала"],"Introducing Cycle Analytics":["Представяме Ви анализа на циклите"],"LFSStatus|Disabled":["Изключено"],"LFSStatus|Enabled":["Включено"],"Last %d day":["Последния %d ден","Последните %d дни"],"Last Pipeline":["Последна схема"],"Last Update":["Последна промяна"],"Last commit":["Последно подаване"],"Learn more in the":[""],"Leave group":["Напускане на групата"],"Leave project":["Напускане на проекта"],"Limited to showing %d event at most":["Ограничено до показване на най-много %d събитие","Ограничено до показване на най-много %d събития"],"Median":["Медиана"],"MissingSSHKeyWarningLink|add an SSH key":["добавите SSH ключ"],"New Issue":["Нов проблем","Нови проблема"],"New Pipeline Schedule":["Нов план за схема"],"New branch":["Нов клон"],"New directory":["Нова папка"],"New file":["Нов файл"],"New issue":["Нов проблем"],"New merge request":["Нова заявка за сливане"],"New schedule":[""],"New snippet":["Нов отрязък"],"New tag":["Нов етикет"],"No repository":["Няма хранилище"],"No schedules":["Няма планове"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"Notification events":["Събития за известяване"],"NotificationEvent|Close issue":["Затваряне на проблем"],"NotificationEvent|Close merge request":["Затваряне на заявка за сливане"],"NotificationEvent|Failed pipeline":["Неуспешно изпълнение на схема"],"NotificationEvent|Merge merge request":["Прилагане на заявка за сливане"],"NotificationEvent|New issue":["Нов проблем"],"NotificationEvent|New merge request":["Нова заявка за сливане"],"NotificationEvent|New note":["Нова бележка"],"NotificationEvent|Reassign issue":["Преназначаване на проблем"],"NotificationEvent|Reassign merge request":["Преназначаване на заявка за сливане"],"NotificationEvent|Reopen issue":["Повторно отваряне на проблем"],"NotificationEvent|Successful pipeline":["Успешно изпълнение на схема"],"NotificationLevel|Custom":["Персонализирани"],"NotificationLevel|Disabled":["Изключени"],"NotificationLevel|Global":["Глобални"],"NotificationLevel|On mention":["При споменаване"],"NotificationLevel|Participate":["Участие"],"NotificationLevel|Watch":["Наблюдение"],"OfSearchInADropdown|Filter":[""],"OpenedNDaysAgo|Opened":["Отворен"],"Options":[""],"Owner":["Собственик"],"Pipeline":[""],"Pipeline Health":["Състояние"],"Pipeline Schedule":["План за схема"],"Pipeline Schedules":["Планове за схема"],"PipelineSchedules|Activated":["Включено"],"PipelineSchedules|Active":["Активно"],"PipelineSchedules|All":["Всички"],"PipelineSchedules|Inactive":["Неактивно"],"PipelineSchedules|Next Run":["Следващо изпълнение"],"PipelineSchedules|None":["Нищо"],"PipelineSchedules|Provide a short description for this pipeline":["Въведете кратко описание за тази схема"],"PipelineSchedules|Take ownership":["Поемане на собствеността"],"PipelineSchedules|Target":["Цел"],"Project '%{project_name}' queued for deletion.":["Проектът „%{project_name}“ е добавен в опашката за изтриване."],"Project '%{project_name}' was successfully created.":["Проектът „%{project_name}“ беше създаден успешно."],"Project '%{project_name}' was successfully updated.":["Проектът „%{project_name}“ беше обновен успешно."],"Project '%{project_name}' will be deleted.":["Проектът „%{project_name}“ ще бъде изтрит."],"Project access must be granted explicitly to each user.":["Достъпът до проекта трябва да бъде даван поотделно на всеки потребител."],"Project export could not be deleted.":["Изнесените данни на проекта не могат да бъдат изтрити."],"Project export has been deleted.":["Изнесените данни на проекта бяха изтрити."],"Project export link has expired. Please generate a new export from your project settings.":["Връзката към изнесените данни на проекта изгуби давност. Моля, създайте нова от настройките на проекта."],"Project export started. A download link will be sent by email.":["Изнасянето на проекта започна. Ще получите връзка към данните по е-поща."],"Project home":["Начална страница на проекта"],"ProjectFeature|Disabled":["Изключено"],"ProjectFeature|Everyone with access":["Всеки с достъп"],"ProjectFeature|Only team members":["Само членовете на екипа"],"ProjectFileTree|Name":["Име"],"ProjectLastActivity|Never":["Никога"],"ProjectLifecycle|Stage":["Етап"],"ProjectNetworkGraph|Graph":["Графика"],"Read more":["Прочетете повече"],"Readme":["ПрочетиМе"],"RefSwitcher|Branches":["Клонове"],"RefSwitcher|Tags":["Етикети"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани внедрени задачи"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Remind later":["Напомняне по-късно"],"Remove project":["Премахване на проекта"],"Request Access":["Заявка за достъп"],"Revert this commit":[""],"Revert this merge-request":[""],"Save pipeline schedule":["Запазване на плана за схема"],"Schedule a new pipeline":["Създаване на нов план за схема"],"Scheduling Pipelines":[""],"Search branches and tags":["Търсене в клоновете и етикетите"],"Select Archive Format":["Изберете формата на архива"],"Select a timezone":["Изберете часова зона"],"Select target branch":["Изберете целеви клон"],"Set a password on your account to pull or push via %{protocol}":["Задайте парола на профила си, за да можете да изтегляте и изпращате промени чрез %{protocol}"],"Set up CI":["Настройка на НИ"],"Set up Koding":["Настройка на „Koding“"],"Set up auto deploy":["Настройка на авт. внедряване"],"SetPasswordToCloneLink|set a password":["зададете парола"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"Source code":["Изходен код"],"StarProject|Star":["Звезда"],"Start a new merge request with these changes":[""],"Switch branch/tag":["Преминаване към клон/етикет"],"Tag":["Етикет","Етикети"],"Tags":["Етикети"],"Target Branch":["Целеви клон"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"The fork relationship has been removed.":["Връзката на разклонение беше премахната."],"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.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"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.":[""],"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.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"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.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия. Данните ще бъдат добавени автоматично след като завършите един пълен цикъл и превърнете първата си идея в реалност."],"The project can be accessed by any logged in user.":["Всеки вписан потребител има достъп до проекта."],"The project can be accessed without any authentication.":["Всеки може да има достъп до проекта, без нужда от удостоверяване."],"The repository for this project does not exist.":["Хранилището за този проект не съществува."],"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.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"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.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"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.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнението на първата Ви схема."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"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.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"This means you can not push code until you create an empty repository or import existing one.":["Това означава, че няма да можете да изпращате код, докато не създадете празно хранилище или не внесете съществуващо такова."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Timeago|%s days ago":["преди %s дни"],"Timeago|%s days remaining":["остават %s дни"],"Timeago|%s hours remaining":["остават %s часа"],"Timeago|%s minutes ago":["преди %s минути"],"Timeago|%s minutes remaining":["остават %s минути"],"Timeago|%s months ago":["преди %s месеца"],"Timeago|%s months remaining":["остават %s месеца"],"Timeago|%s seconds remaining":["остават %s секунди"],"Timeago|%s weeks ago":["преди %s седмици"],"Timeago|%s weeks remaining":["остават %s седмици"],"Timeago|%s years ago":["преди %s години"],"Timeago|%s years remaining":["остават %s години"],"Timeago|1 day remaining":["остава 1 ден"],"Timeago|1 hour remaining":["остава 1 час"],"Timeago|1 minute remaining":["остава 1 минута"],"Timeago|1 month remaining":["остава 1 месец"],"Timeago|1 week remaining":["остава 1 седмица"],"Timeago|1 year remaining":["остава 1 година"],"Timeago|Past due":["Просрочено"],"Timeago|a day ago":["преди един ден"],"Timeago|a month ago":["преди един месец"],"Timeago|a week ago":["преди една седмица"],"Timeago|a while":["преди известно време"],"Timeago|a year ago":["преди една година"],"Timeago|about %s hours ago":["преди около %s часа"],"Timeago|about a minute ago":["преди около една минута"],"Timeago|about an hour ago":["преди около един час"],"Timeago|in %s days":["след %s дни"],"Timeago|in %s hours":["след %s часа"],"Timeago|in %s minutes":["след %s минути"],"Timeago|in %s months":["след %s месеца"],"Timeago|in %s seconds":["след %s секунди"],"Timeago|in %s weeks":["след %s седмици"],"Timeago|in %s years":["след %s години"],"Timeago|in 1 day":["след 1 ден"],"Timeago|in 1 hour":["след 1 час"],"Timeago|in 1 minute":["след 1 минута"],"Timeago|in 1 month":["след 1 месец"],"Timeago|in 1 week":["след 1 седмица"],"Timeago|in 1 year":["след 1 година"],"Timeago|less than a minute ago":["преди по-малко от минута"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Unstar":["Без звезда"],"Upload New File":["Качване на нов файл"],"Upload file":["Качване на файл"],"Use your global notification setting":["Използване на глобалната Ви настройка за известията"],"VisibilityLevel|Internal":["Вътрешен"],"VisibilityLevel|Private":["Частен"],"VisibilityLevel|Public":["Публичен"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"Withdraw Access Request":["Оттегляне на заявката за достъп"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["На път сте да премахнете „%{project_name_with_namespace}“.\\nАко го премахнете, той НЕ може да бъде възстановен!\\nНАИСТИНА ли искате това?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":[""],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["На път сте да прехвърлите „%{project_name_with_namespace}“ към друг собственик. НАИСТИНА ли искате това?"],"You can only add files when you are on a branch":["Можете да добавяте файлове само когато се намирате в клон"],"You must sign in to star a project":["Трябва да се впишете, за да отбележите проект със звезда"],"You need permission.":["Нуждаете се от разрешение."],"You will not get any notifications via email":["Няма да получавате никакви известия по е-поща"],"You will only receive notifications for the events you choose":["Ще получавате известия само за събитията, за които желаете"],"You will only receive notifications for threads you have participated in":["Ще получавате известия само за нещата, в които участвате"],"You will receive notifications for any activity":["Ще получавате известия за всяка дейност"],"You will receive notifications only for comments in which you were @mentioned":["Ще получавате известия само за коментари, в които Ви @споменават"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["Няма да можете да изтегляте или изпращате код в проекта чрез %{protocol}, докато не %{set_password_link} за профила си"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["Няма да можете да изтегляте или изпращате код в проекта чрез SSH, докато не %{add_ssh_key_link} в профила си"],"Your name":["Вашето име"],"day":["ден","дни"],"notification emails":["известия по е-поща"],"parent":["",""],"pipeline schedules documentation":[""],"with stage":["",""]}}}; \ No newline at end of file diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po index 41805a7792e..fd00796d763 100644 --- a/locale/bg/gitlab.po +++ b/locale/bg/gitlab.po @@ -3,34 +3,245 @@ msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-07 21:22+0200\n" +"POT-Creation-Date: 2017-06-12 19:29-0500\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-10 03:35-0400\n" +"PO-Revision-Date: 2017-06-12 09:36-0400\n" "Last-Translator: Lyubomir Vasilev \n" -"Language-Team: Bulgarian\n" +"Language-Team: Bulgarian (https://translate.zanata.org/project/view/GitLab)\n" "Language: bg\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +msgid "%{commit_author_link} committed %{commit_timeago}" +msgstr "" + +msgid "About auto deploy" +msgstr "Относно автоматичното внедряване" + +msgid "Active" +msgstr "" + +msgid "Activity" +msgstr "Дейност" + +msgid "Add Changelog" +msgstr "Добавяне на списък с промени" + +msgid "Add Contribution guide" +msgstr "Добавяне на ръководство за сътрудничество" + +msgid "Add License" +msgstr "Добавяне на лиценз" + +msgid "Add an SSH key to your profile to pull or push via SSH." +msgstr "" +"Добавете SSH ключ в профила си, за да можете да изтегляте или изпращате " +"промени чрез SSH." + +msgid "Add new directory" +msgstr "Добавяне на нова папка" + +msgid "Archived project! Repository is read-only" +msgstr "Архивиран проект! Хранилището е само за четене" + msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Наистина ли искате да изтриете този план за схема?" +msgid "Attach a file by drag & drop or %{upload_link}" +msgstr "" + +msgid "Branch" +msgid_plural "Branches" +msgstr[0] "Клон" +msgstr[1] "Клонове" + +msgid "" +"Branch %{branch_name} was created. To set up auto deploy, " +"choose a GitLab CI Yaml template and commit your changes. " +"%{link_to_autodeploy_doc}" +msgstr "" +"Клонът %{branch_name} беше създаден. За да настроите " +"автоматичното внедряване, изберете Yaml шаблон за GitLab CI и подайте " +"промените си. %{link_to_autodeploy_doc}" + +msgid "Branches" +msgstr "Клонове" + +msgid "Browse files" +msgstr "" + msgid "ByAuthor|by" msgstr "от" +msgid "CI configuration" +msgstr "Конфигурация на непрекъсната интеграция" + msgid "Cancel" msgstr "Отказ" +msgid "ChangeTypeActionLabel|Pick into branch" +msgstr "" + +msgid "ChangeTypeActionLabel|Revert in branch" +msgstr "" + +msgid "ChangeTypeAction|Cherry-pick" +msgstr "" + +msgid "ChangeType|commit" +msgstr "" + +msgid "ChangeType|merge request" +msgstr "" + +msgid "Changelog" +msgstr "Списък с промени" + +msgid "Charts" +msgstr "Графики" + +msgid "Cherry-pick this commit" +msgstr "" + +msgid "Cherry-pick this merge-request" +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 "Commit" msgid_plural "Commits" msgstr[0] "Подаване" msgstr[1] "Подавания" +msgid "Commit message" +msgstr "" + +msgid "CommitMessage|Add %{file_name}" +msgstr "Добавяне на „%{file_name}“" + +msgid "Commits" +msgstr "Подавания" + +msgid "Commits|History" +msgstr "История" + +msgid "Committed by" +msgstr "" + +msgid "Compare" +msgstr "Сравнение" + +msgid "Contribution guide" +msgstr "Ръководство за сътрудничество" + +msgid "Contributors" +msgstr "Сътрудници" + +msgid "Copy URL to clipboard" +msgstr "Копиране на адреса в буфера за обмен" + +msgid "Copy commit SHA to clipboard" +msgstr "Копиране на идентификатора на подаването в буфера за обмен" + +msgid "Create New Directory" +msgstr "Създаване на нова папка" + +msgid "Create directory" +msgstr "Създаване на папка" + +msgid "Create empty bare repository" +msgstr "Създаване на празно хранилище" + +msgid "Create merge request" +msgstr "Създаване на заявка за сливане" + +msgid "Create new..." +msgstr "" + +msgid "CreateNewFork|Fork" +msgstr "Разклоняване" + +msgid "CreateTag|Tag" +msgstr "" + msgid "Cron Timezone" msgstr "Часова зона за „Cron“" +msgid "Cron syntax" +msgstr "" + +msgid "Custom" +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 "" +"Персонализираните нива на известяване са същите като нивата за участие. С " +"персонализираните нива на известяване ще можете да получавате и известия за " +"избрани събития. За да научите повече, прегледайте %{notification_link}." + +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." @@ -59,6 +270,9 @@ msgstr "Подготовка за издаване" msgid "CycleAnalyticsStage|Test" msgstr "Тестване" +msgid "Define a custom pattern with cron syntax" +msgstr "" + msgid "Delete" msgstr "Изтриване" @@ -70,20 +284,68 @@ msgstr[1] "Внедрявания" msgid "Description" msgstr "Описание" +msgid "Directory name" +msgstr "Име на папката" + +msgid "Don't show again" +msgstr "Да не се показва повече" + +msgid "Download" +msgstr "Сваляне" + +msgid "Download tar" +msgstr "Сваляне във формат „tar“" + +msgid "Download tar.bz2" +msgstr "Сваляне във формат „tar.bz2“" + +msgid "Download tar.gz" +msgstr "Сваляне във формат „tar.gz“" + +msgid "Download zip" +msgstr "Сваляне във формат „zip“" + +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 "Редактиране на плана %{id} за схема" +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 "Failed to change the owner" msgstr "Собственикът не може да бъде променен" msgid "Failed to remove the pipeline schedule" msgstr "Планът за схема не може да бъде премахнат" -msgid "Filter" -msgstr "Филтриране" +msgid "Files" +msgstr "Файлове" + +msgid "Find by path" +msgstr "Търсене по път" + +msgid "Find file" +msgstr "Търсене на файл" msgid "FirstPushedBy|First" msgstr "Първо" @@ -91,6 +353,15 @@ msgstr "Първо" msgid "FirstPushedBy|pushed by" msgstr "изпращане на промени от" +#, fuzzy +msgid "Fork" +msgid_plural "Forks" +msgstr[0] "Наследяване" +msgstr[1] "" + +msgid "ForkedFromProjectPath|Forked from" +msgstr "Разклонение на" + msgid "From issue creation until deploy to production" msgstr "От създаването на проблема до внедряването в крайната версия" @@ -98,12 +369,33 @@ msgid "From merge request merge until deploy to production" msgstr "" "От прилагането на заявката за сливане до внедряването в крайната версия" +msgid "Go to your fork" +msgstr "Към Вашето разклонение" + +msgid "GoToYourFork|Fork" +msgstr "Разклонение" + +msgid "Home" +msgstr "Начало" + +msgid "Housekeeping successfully started" +msgstr "Освежаването започна успешно" + +msgid "Import repository" +msgstr "Внасяне на хранилище" + msgid "Interval Pattern" msgstr "Шаблон за интервала" msgid "Introducing Cycle Analytics" msgstr "Представяме Ви анализа на циклите" +msgid "LFSStatus|Disabled" +msgstr "Изключено" + +msgid "LFSStatus|Enabled" +msgstr "Включено" + msgid "Last %d day" msgid_plural "Last %d days" msgstr[0] "Последния %d ден" @@ -112,14 +404,32 @@ msgstr[1] "Последните %d дни" msgid "Last Pipeline" msgstr "Последна схема" +msgid "Last Update" +msgstr "Последна промяна" + +msgid "Last commit" +msgstr "Последно подаване" + +msgid "Learn more in the" +msgstr "" + +msgid "Leave group" +msgstr "Напускане на групата" + +msgid "Leave project" +msgstr "Напускане на проекта" + msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" -msgstr[0] "Ограничено до показване на последното %d събитие" -msgstr[1] "Ограничено до показване на последните %d събития" +msgstr[0] "Ограничено до показване на най-много %d събитие" +msgstr[1] "Ограничено до показване на най-много %d събития" msgid "Median" msgstr "Медиана" +msgid "MissingSSHKeyWarningLink|add an SSH key" +msgstr "добавите SSH ключ" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "Нов проблем" @@ -128,6 +438,33 @@ msgstr[1] "Нови проблема" msgid "New Pipeline Schedule" msgstr "Нов план за схема" +msgid "New branch" +msgstr "Нов клон" + +msgid "New directory" +msgstr "Нова папка" + +msgid "New file" +msgstr "Нов файл" + +msgid "New issue" +msgstr "Нов проблем" + +msgid "New merge request" +msgstr "Нова заявка за сливане" + +msgid "New schedule" +msgstr "" + +msgid "New snippet" +msgstr "Нов отрязък" + +msgid "New tag" +msgstr "Нов етикет" + +msgid "No repository" +msgstr "Няма хранилище" + msgid "No schedules" msgstr "Няма планове" @@ -137,12 +474,75 @@ 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 "OfSearchInADropdown|Filter" +msgstr "" + msgid "OpenedNDaysAgo|Opened" msgstr "Отворен" +msgid "Options" +msgstr "" + msgid "Owner" msgstr "Собственик" +msgid "Pipeline" +msgstr "" + msgid "Pipeline Health" msgstr "Състояние" @@ -179,17 +579,80 @@ msgstr "Поемане на собствеността" msgid "PipelineSchedules|Target" msgstr "Цел" +msgid "Project '%{project_name}' queued for deletion." +msgstr "Проектът „%{project_name}“ е добавен в опашката за изтриване." + +msgid "Project '%{project_name}' was successfully created." +msgstr "Проектът „%{project_name}“ беше създаден успешно." + +msgid "Project '%{project_name}' was successfully updated." +msgstr "Проектът „%{project_name}“ беше обновен успешно." + +msgid "Project '%{project_name}' will be deleted." +msgstr "Проектът „%{project_name}“ ще бъде изтрит." + +msgid "Project access must be granted explicitly to each user." +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 "Project home" +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 "Read more" msgstr "Прочетете повече" +msgid "Readme" +msgstr "ПрочетиМе" + +msgid "RefSwitcher|Branches" +msgstr "Клонове" + +msgid "RefSwitcher|Tags" +msgstr "Етикети" + msgid "Related Commits" msgstr "Свързани подавания" msgid "Related Deployed Jobs" -msgstr "Свързани задачи за внедряване" +msgstr "Свързани внедрени задачи" msgid "Related Issues" msgstr "Свързани проблеми" @@ -203,23 +666,84 @@ msgstr "Свързани заявки за сливане" msgid "Related Merged Requests" msgstr "Свързани приложени заявки за сливане" +msgid "Remind later" +msgstr "Напомняне по-късно" + +msgid "Remove project" +msgstr "Премахване на проекта" + +msgid "Request Access" +msgstr "Заявка за достъп" + +msgid "Revert this commit" +msgstr "" + +msgid "Revert this merge-request" +msgstr "" + msgid "Save pipeline schedule" msgstr "Запазване на плана за схема" msgid "Schedule a new pipeline" msgstr "Създаване на нов план за схема" +msgid "Scheduling Pipelines" +msgstr "" + +msgid "Search branches and tags" +msgstr "Търсене в клоновете и етикетите" + +msgid "Select Archive Format" +msgstr "Изберете формата на архива" + msgid "Select a timezone" msgstr "Изберете часова зона" msgid "Select target branch" msgstr "Изберете целеви клон" +msgid "Set a password on your account to pull or push via %{protocol}" +msgstr "" +"Задайте парола на профила си, за да можете да изтегляте и изпращате промени " +"чрез %{protocol}" + +msgid "Set up CI" +msgstr "Настройка на НИ" + +msgid "Set up Koding" +msgstr "Настройка на „Koding“" + +msgid "Set up auto deploy" +msgstr "Настройка на авт. внедряване" + +msgid "SetPasswordToCloneLink|set a password" +msgstr "зададете парола" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "Показване на %d събитие" msgstr[1] "Показване на %d събития" +msgid "Source code" +msgstr "Изходен код" + +msgid "StarProject|Star" +msgstr "Звезда" + +msgid "Start a new merge request with these changes" +msgstr "" + +msgid "Switch branch/tag" +msgstr "Преминаване към клон/етикет" + +msgid "Tag" +msgid_plural "Tags" +msgstr[0] "Етикет" +msgstr[1] "Етикети" + +msgid "Tags" +msgstr "Етикети" + msgid "Target Branch" msgstr "Целеви клон" @@ -235,6 +759,9 @@ 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. " @@ -248,6 +775,12 @@ 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 " @@ -263,7 +796,18 @@ msgid "" "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 " @@ -305,6 +849,13 @@ msgstr "" "данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е " "(5+7)/2 = 6." +msgid "" +"This means you can not push code until you create an empty repository or " +"import existing one." +msgstr "" +"Това означава, че няма да можете да изпращате код, докато не създадете " +"празно хранилище или не внесете съществуващо такова." + msgid "Time before an issue gets scheduled" msgstr "Време преди един проблем да бъде планиран за работа" @@ -318,6 +869,129 @@ msgstr "" msgid "Time until first merge request" msgstr "Време преди първата заявка за сливане" +msgid "Timeago|%s days ago" +msgstr "преди %s дни" + +msgid "Timeago|%s days remaining" +msgstr "остават %s дни" + +msgid "Timeago|%s hours remaining" +msgstr "остават %s часа" + +msgid "Timeago|%s minutes ago" +msgstr "преди %s минути" + +msgid "Timeago|%s minutes remaining" +msgstr "остават %s минути" + +msgid "Timeago|%s months ago" +msgstr "преди %s месеца" + +msgid "Timeago|%s months remaining" +msgstr "остават %s месеца" + +msgid "Timeago|%s seconds remaining" +msgstr "остават %s секунди" + +msgid "Timeago|%s weeks ago" +msgstr "преди %s седмици" + +msgid "Timeago|%s weeks remaining" +msgstr "остават %s седмици" + +msgid "Timeago|%s years ago" +msgstr "преди %s години" + +msgid "Timeago|%s years remaining" +msgstr "остават %s години" + +msgid "Timeago|1 day remaining" +msgstr "остава 1 ден" + +msgid "Timeago|1 hour remaining" +msgstr "остава 1 час" + +msgid "Timeago|1 minute remaining" +msgstr "остава 1 минута" + +msgid "Timeago|1 month remaining" +msgstr "остава 1 месец" + +msgid "Timeago|1 week remaining" +msgstr "остава 1 седмица" + +msgid "Timeago|1 year remaining" +msgstr "остава 1 година" + +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 while" +msgstr "преди известно време" + +msgid "Timeago|a year ago" +msgstr "преди една година" + +msgid "Timeago|about %s hours ago" +msgstr "преди около %s часа" + +msgid "Timeago|about a minute ago" +msgstr "преди около една минута" + +msgid "Timeago|about an hour ago" +msgstr "преди около един час" + +msgid "Timeago|in %s days" +msgstr "след %s дни" + +msgid "Timeago|in %s hours" +msgstr "след %s часа" + +msgid "Timeago|in %s minutes" +msgstr "след %s минути" + +msgid "Timeago|in %s months" +msgstr "след %s месеца" + +msgid "Timeago|in %s seconds" +msgstr "след %s секунди" + +msgid "Timeago|in %s weeks" +msgstr "след %s седмици" + +msgid "Timeago|in %s years" +msgstr "след %s години" + +msgid "Timeago|in 1 day" +msgstr "след 1 ден" + +msgid "Timeago|in 1 hour" +msgstr "след 1 час" + +msgid "Timeago|in 1 minute" +msgstr "след 1 минута" + +msgid "Timeago|in 1 month" +msgstr "след 1 месец" + +msgid "Timeago|in 1 week" +msgstr "след 1 седмица" + +msgid "Timeago|in 1 year" +msgstr "след 1 година" + +msgid "Timeago|less than a minute ago" +msgstr "преди по-малко от минута" + msgid "Time|hr" msgid_plural "Time|hrs" msgstr[0] "час" @@ -337,17 +1011,119 @@ msgstr "Общо време" msgid "Total test time for all commits/merges" msgstr "Общо време за тестване на всички подавания/сливания" +msgid "Unstar" +msgstr "Без звезда" + +msgid "Upload New File" +msgstr "Качване на нов файл" + +msgid "Upload file" +msgstr "Качване на файл" + +msgid "Use your global notification setting" +msgstr "Използване на глобалната Ви настройка за известията" + +msgid "VisibilityLevel|Internal" +msgstr "Вътрешен" + +msgid "VisibilityLevel|Private" +msgstr "Частен" + +msgid "VisibilityLevel|Public" +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 "Withdraw Access Request" +msgstr "Оттегляне на заявката за достъп" + +msgid "" +"You are going to remove %{project_name_with_namespace}.\n" +"Removed project CANNOT be restored!\n" +"Are you ABSOLUTELY sure?" +msgstr "" +"На път сте да премахнете „%{project_name_with_namespace}“.\n" +"Ако го премахнете, той НЕ може да бъде възстановен!\n" +"НАИСТИНА ли искате това?" + +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 "" +"На път сте да прехвърлите „%{project_name_with_namespace}“ към друг " +"собственик. НАИСТИНА ли искате това?" + +msgid "You can only add files when you are on a branch" +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 "" +"Няма да можете да изтегляте или изпращате код в проекта чрез %{protocol}, " +"докато не %{set_password_link} за профила си" + +msgid "" +"You won't be able to pull or push project code via SSH until you " +"%{add_ssh_key_link} to your profile" +msgstr "" +"Няма да можете да изтегляте или изпращате код в проекта чрез SSH, докато не " +"%{add_ssh_key_link} в профила си" + +msgid "Your name" +msgstr "Вашето име" + msgid "day" msgid_plural "days" msgstr[0] "ден" msgstr[1] "дни" +msgid "notification emails" +msgstr "известия по е-поща" + +msgid "parent" +msgid_plural "parents" +msgstr[0] "" +msgstr[1] "" + +msgid "pipeline schedules documentation" +msgstr "" + +msgid "with stage" +msgid_plural "with stages" +msgstr[0] "" +msgstr[1] "" + From 265f76b678177dd8684d98cb5a596c1fd5c20214 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Mon, 12 Jun 2017 13:22:33 +0800 Subject: [PATCH 0073/1380] supplement bulgarian translation Fix #33561 --- app/assets/javascripts/locale/bg/app.js | 2 +- locale/bg/gitlab.po | 794 +----------------------- 2 files changed, 10 insertions(+), 786 deletions(-) diff --git a/app/assets/javascripts/locale/bg/app.js b/app/assets/javascripts/locale/bg/app.js index 33a5c3c7eb9..f1fedb546de 100644 --- a/app/assets/javascripts/locale/bg/app.js +++ b/app/assets/javascripts/locale/bg/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-12 09:36-0400","Last-Translator":"Lyubomir Vasilev ","Language-Team":"Bulgarian (https://translate.zanata.org/project/view/GitLab)","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"%{commit_author_link} committed %{commit_timeago}":[""],"About auto deploy":["Относно автоматичното внедряване"],"Active":[""],"Activity":["Дейност"],"Add Changelog":["Добавяне на списък с промени"],"Add Contribution guide":["Добавяне на ръководство за сътрудничество"],"Add License":["Добавяне на лиценз"],"Add an SSH key to your profile to pull or push via SSH.":["Добавете SSH ключ в профила си, за да можете да изтегляте или изпращате промени чрез SSH."],"Add new directory":["Добавяне на нова папка"],"Archived project! Repository is read-only":["Архивиран проект! Хранилището е само за четене"],"Are you sure you want to delete this pipeline schedule?":["Наистина ли искате да изтриете този план за схема?"],"Attach a file by drag & drop or %{upload_link}":[""],"Branch":["Клон","Клонове"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["Клонът %{branch_name} беше създаден. За да настроите автоматичното внедряване, изберете Yaml шаблон за GitLab CI и подайте промените си. %{link_to_autodeploy_doc}"],"Branches":["Клонове"],"Browse files":[""],"ByAuthor|by":["от"],"CI configuration":["Конфигурация на непрекъсната интеграция"],"Cancel":["Отказ"],"ChangeTypeActionLabel|Pick into branch":[""],"ChangeTypeActionLabel|Revert in branch":[""],"ChangeTypeAction|Cherry-pick":[""],"ChangeType|commit":[""],"ChangeType|merge request":[""],"Changelog":["Списък с промени"],"Charts":["Графики"],"Cherry-pick this commit":[""],"Cherry-pick this merge-request":[""],"CiStatusLabel|canceled":["отказано"],"CiStatusLabel|created":["създадено"],"CiStatusLabel|failed":["неуспешно"],"CiStatusLabel|manual action":["ръчно действие"],"CiStatusLabel|passed":["успешно"],"CiStatusLabel|passed with warnings":["успешно, с предупреждения"],"CiStatusLabel|pending":["на изчакване"],"CiStatusLabel|skipped":["пропуснато"],"CiStatusLabel|waiting for manual action":["чакане за ръчно действие"],"CiStatusText|blocked":["блокирано"],"CiStatusText|canceled":["отказано"],"CiStatusText|created":["създадено"],"CiStatusText|failed":["неуспешно"],"CiStatusText|manual":["ръчно"],"CiStatusText|passed":["успешно"],"CiStatusText|pending":["на изчакване"],"CiStatusText|skipped":["пропуснато"],"CiStatus|running":["протича в момента"],"Commit":["Подаване","Подавания"],"Commit message":[""],"CommitMessage|Add %{file_name}":["Добавяне на „%{file_name}“"],"Commits":["Подавания"],"Commits|History":["История"],"Committed by":[""],"Compare":["Сравнение"],"Contribution guide":["Ръководство за сътрудничество"],"Contributors":["Сътрудници"],"Copy URL to clipboard":["Копиране на адреса в буфера за обмен"],"Copy commit SHA to clipboard":["Копиране на идентификатора на подаването в буфера за обмен"],"Create New Directory":["Създаване на нова папка"],"Create directory":["Създаване на папка"],"Create empty bare repository":["Създаване на празно хранилище"],"Create merge request":["Създаване на заявка за сливане"],"Create new...":[""],"CreateNewFork|Fork":["Разклоняване"],"CreateTag|Tag":[""],"Cron Timezone":["Часова зона за „Cron“"],"Cron syntax":[""],"Custom":[""],"Custom notification events":["Персонализирани събития за известяване"],"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}.":["Персонализираните нива на известяване са същите като нивата за участие. С персонализираните нива на известяване ще можете да получавате и известия за избрани събития. За да научите повече, прегледайте %{notification_link}."],"Cycle Analytics":["Анализ на циклите"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Define a custom pattern with cron syntax":[""],"Delete":["Изтриване"],"Deploy":["Внедряване","Внедрявания"],"Description":["Описание"],"Directory name":["Име на папката"],"Don't show again":["Да не се показва повече"],"Download":["Сваляне"],"Download tar":["Сваляне във формат „tar“"],"Download tar.bz2":["Сваляне във формат „tar.bz2“"],"Download tar.gz":["Сваляне във формат „tar.gz“"],"Download zip":["Сваляне във формат „zip“"],"DownloadArtifacts|Download":["Сваляне"],"DownloadCommit|Email Patches":[""],"DownloadCommit|Plain Diff":[""],"DownloadSource|Download":["Сваляне"],"Edit":["Редактиране"],"Edit Pipeline Schedule %{id}":["Редактиране на плана %{id} за схема"],"Every day (at 4:00am)":[""],"Every month (on the 1st at 4:00am)":[""],"Every week (Sundays at 4:00am)":[""],"Failed to change the owner":["Собственикът не може да бъде променен"],"Failed to remove the pipeline schedule":["Планът за схема не може да бъде премахнат"],"Files":["Файлове"],"Find by path":["Търсене по път"],"Find file":["Търсене на файл"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"Fork":["Наследяване",""],"ForkedFromProjectPath|Forked from":["Разклонение на"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Go to your fork":["Към Вашето разклонение"],"GoToYourFork|Fork":["Разклонение"],"Home":["Начало"],"Housekeeping successfully started":["Освежаването започна успешно"],"Import repository":["Внасяне на хранилище"],"Interval Pattern":["Шаблон за интервала"],"Introducing Cycle Analytics":["Представяме Ви анализа на циклите"],"LFSStatus|Disabled":["Изключено"],"LFSStatus|Enabled":["Включено"],"Last %d day":["Последния %d ден","Последните %d дни"],"Last Pipeline":["Последна схема"],"Last Update":["Последна промяна"],"Last commit":["Последно подаване"],"Learn more in the":[""],"Leave group":["Напускане на групата"],"Leave project":["Напускане на проекта"],"Limited to showing %d event at most":["Ограничено до показване на най-много %d събитие","Ограничено до показване на най-много %d събития"],"Median":["Медиана"],"MissingSSHKeyWarningLink|add an SSH key":["добавите SSH ключ"],"New Issue":["Нов проблем","Нови проблема"],"New Pipeline Schedule":["Нов план за схема"],"New branch":["Нов клон"],"New directory":["Нова папка"],"New file":["Нов файл"],"New issue":["Нов проблем"],"New merge request":["Нова заявка за сливане"],"New schedule":[""],"New snippet":["Нов отрязък"],"New tag":["Нов етикет"],"No repository":["Няма хранилище"],"No schedules":["Няма планове"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"Notification events":["Събития за известяване"],"NotificationEvent|Close issue":["Затваряне на проблем"],"NotificationEvent|Close merge request":["Затваряне на заявка за сливане"],"NotificationEvent|Failed pipeline":["Неуспешно изпълнение на схема"],"NotificationEvent|Merge merge request":["Прилагане на заявка за сливане"],"NotificationEvent|New issue":["Нов проблем"],"NotificationEvent|New merge request":["Нова заявка за сливане"],"NotificationEvent|New note":["Нова бележка"],"NotificationEvent|Reassign issue":["Преназначаване на проблем"],"NotificationEvent|Reassign merge request":["Преназначаване на заявка за сливане"],"NotificationEvent|Reopen issue":["Повторно отваряне на проблем"],"NotificationEvent|Successful pipeline":["Успешно изпълнение на схема"],"NotificationLevel|Custom":["Персонализирани"],"NotificationLevel|Disabled":["Изключени"],"NotificationLevel|Global":["Глобални"],"NotificationLevel|On mention":["При споменаване"],"NotificationLevel|Participate":["Участие"],"NotificationLevel|Watch":["Наблюдение"],"OfSearchInADropdown|Filter":[""],"OpenedNDaysAgo|Opened":["Отворен"],"Options":[""],"Owner":["Собственик"],"Pipeline":[""],"Pipeline Health":["Състояние"],"Pipeline Schedule":["План за схема"],"Pipeline Schedules":["Планове за схема"],"PipelineSchedules|Activated":["Включено"],"PipelineSchedules|Active":["Активно"],"PipelineSchedules|All":["Всички"],"PipelineSchedules|Inactive":["Неактивно"],"PipelineSchedules|Next Run":["Следващо изпълнение"],"PipelineSchedules|None":["Нищо"],"PipelineSchedules|Provide a short description for this pipeline":["Въведете кратко описание за тази схема"],"PipelineSchedules|Take ownership":["Поемане на собствеността"],"PipelineSchedules|Target":["Цел"],"Project '%{project_name}' queued for deletion.":["Проектът „%{project_name}“ е добавен в опашката за изтриване."],"Project '%{project_name}' was successfully created.":["Проектът „%{project_name}“ беше създаден успешно."],"Project '%{project_name}' was successfully updated.":["Проектът „%{project_name}“ беше обновен успешно."],"Project '%{project_name}' will be deleted.":["Проектът „%{project_name}“ ще бъде изтрит."],"Project access must be granted explicitly to each user.":["Достъпът до проекта трябва да бъде даван поотделно на всеки потребител."],"Project export could not be deleted.":["Изнесените данни на проекта не могат да бъдат изтрити."],"Project export has been deleted.":["Изнесените данни на проекта бяха изтрити."],"Project export link has expired. Please generate a new export from your project settings.":["Връзката към изнесените данни на проекта изгуби давност. Моля, създайте нова от настройките на проекта."],"Project export started. A download link will be sent by email.":["Изнасянето на проекта започна. Ще получите връзка към данните по е-поща."],"Project home":["Начална страница на проекта"],"ProjectFeature|Disabled":["Изключено"],"ProjectFeature|Everyone with access":["Всеки с достъп"],"ProjectFeature|Only team members":["Само членовете на екипа"],"ProjectFileTree|Name":["Име"],"ProjectLastActivity|Never":["Никога"],"ProjectLifecycle|Stage":["Етап"],"ProjectNetworkGraph|Graph":["Графика"],"Read more":["Прочетете повече"],"Readme":["ПрочетиМе"],"RefSwitcher|Branches":["Клонове"],"RefSwitcher|Tags":["Етикети"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани внедрени задачи"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Remind later":["Напомняне по-късно"],"Remove project":["Премахване на проекта"],"Request Access":["Заявка за достъп"],"Revert this commit":[""],"Revert this merge-request":[""],"Save pipeline schedule":["Запазване на плана за схема"],"Schedule a new pipeline":["Създаване на нов план за схема"],"Scheduling Pipelines":[""],"Search branches and tags":["Търсене в клоновете и етикетите"],"Select Archive Format":["Изберете формата на архива"],"Select a timezone":["Изберете часова зона"],"Select target branch":["Изберете целеви клон"],"Set a password on your account to pull or push via %{protocol}":["Задайте парола на профила си, за да можете да изтегляте и изпращате промени чрез %{protocol}"],"Set up CI":["Настройка на НИ"],"Set up Koding":["Настройка на „Koding“"],"Set up auto deploy":["Настройка на авт. внедряване"],"SetPasswordToCloneLink|set a password":["зададете парола"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"Source code":["Изходен код"],"StarProject|Star":["Звезда"],"Start a new merge request with these changes":[""],"Switch branch/tag":["Преминаване към клон/етикет"],"Tag":["Етикет","Етикети"],"Tags":["Етикети"],"Target Branch":["Целеви клон"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"The fork relationship has been removed.":["Връзката на разклонение беше премахната."],"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.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"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.":[""],"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.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"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.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия. Данните ще бъдат добавени автоматично след като завършите един пълен цикъл и превърнете първата си идея в реалност."],"The project can be accessed by any logged in user.":["Всеки вписан потребител има достъп до проекта."],"The project can be accessed without any authentication.":["Всеки може да има достъп до проекта, без нужда от удостоверяване."],"The repository for this project does not exist.":["Хранилището за този проект не съществува."],"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.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"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.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"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.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнението на първата Ви схема."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"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.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"This means you can not push code until you create an empty repository or import existing one.":["Това означава, че няма да можете да изпращате код, докато не създадете празно хранилище или не внесете съществуващо такова."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Timeago|%s days ago":["преди %s дни"],"Timeago|%s days remaining":["остават %s дни"],"Timeago|%s hours remaining":["остават %s часа"],"Timeago|%s minutes ago":["преди %s минути"],"Timeago|%s minutes remaining":["остават %s минути"],"Timeago|%s months ago":["преди %s месеца"],"Timeago|%s months remaining":["остават %s месеца"],"Timeago|%s seconds remaining":["остават %s секунди"],"Timeago|%s weeks ago":["преди %s седмици"],"Timeago|%s weeks remaining":["остават %s седмици"],"Timeago|%s years ago":["преди %s години"],"Timeago|%s years remaining":["остават %s години"],"Timeago|1 day remaining":["остава 1 ден"],"Timeago|1 hour remaining":["остава 1 час"],"Timeago|1 minute remaining":["остава 1 минута"],"Timeago|1 month remaining":["остава 1 месец"],"Timeago|1 week remaining":["остава 1 седмица"],"Timeago|1 year remaining":["остава 1 година"],"Timeago|Past due":["Просрочено"],"Timeago|a day ago":["преди един ден"],"Timeago|a month ago":["преди един месец"],"Timeago|a week ago":["преди една седмица"],"Timeago|a while":["преди известно време"],"Timeago|a year ago":["преди една година"],"Timeago|about %s hours ago":["преди около %s часа"],"Timeago|about a minute ago":["преди около една минута"],"Timeago|about an hour ago":["преди около един час"],"Timeago|in %s days":["след %s дни"],"Timeago|in %s hours":["след %s часа"],"Timeago|in %s minutes":["след %s минути"],"Timeago|in %s months":["след %s месеца"],"Timeago|in %s seconds":["след %s секунди"],"Timeago|in %s weeks":["след %s седмици"],"Timeago|in %s years":["след %s години"],"Timeago|in 1 day":["след 1 ден"],"Timeago|in 1 hour":["след 1 час"],"Timeago|in 1 minute":["след 1 минута"],"Timeago|in 1 month":["след 1 месец"],"Timeago|in 1 week":["след 1 седмица"],"Timeago|in 1 year":["след 1 година"],"Timeago|less than a minute ago":["преди по-малко от минута"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Unstar":["Без звезда"],"Upload New File":["Качване на нов файл"],"Upload file":["Качване на файл"],"Use your global notification setting":["Използване на глобалната Ви настройка за известията"],"VisibilityLevel|Internal":["Вътрешен"],"VisibilityLevel|Private":["Частен"],"VisibilityLevel|Public":["Публичен"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"Withdraw Access Request":["Оттегляне на заявката за достъп"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["На път сте да премахнете „%{project_name_with_namespace}“.\\nАко го премахнете, той НЕ може да бъде възстановен!\\nНАИСТИНА ли искате това?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":[""],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["На път сте да прехвърлите „%{project_name_with_namespace}“ към друг собственик. НАИСТИНА ли искате това?"],"You can only add files when you are on a branch":["Можете да добавяте файлове само когато се намирате в клон"],"You must sign in to star a project":["Трябва да се впишете, за да отбележите проект със звезда"],"You need permission.":["Нуждаете се от разрешение."],"You will not get any notifications via email":["Няма да получавате никакви известия по е-поща"],"You will only receive notifications for the events you choose":["Ще получавате известия само за събитията, за които желаете"],"You will only receive notifications for threads you have participated in":["Ще получавате известия само за нещата, в които участвате"],"You will receive notifications for any activity":["Ще получавате известия за всяка дейност"],"You will receive notifications only for comments in which you were @mentioned":["Ще получавате известия само за коментари, в които Ви @споменават"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["Няма да можете да изтегляте или изпращате код в проекта чрез %{protocol}, докато не %{set_password_link} за профила си"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["Няма да можете да изтегляте или изпращате код в проекта чрез SSH, докато не %{add_ssh_key_link} в профила си"],"Your name":["Вашето име"],"day":["ден","дни"],"notification emails":["известия по е-поща"],"parent":["",""],"pipeline schedules documentation":[""],"with stage":["",""]}}}; \ No newline at end of file +var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-07 21:22+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-10 03:35-0400","Last-Translator":"Lyubomir Vasilev ","Language-Team":"Bulgarian","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"Are you sure you want to delete this pipeline schedule?":["Наистина ли искате да изтриете този план за схема?"],"ByAuthor|by":["от"],"Cancel":["Отказ"],"Commit":["Подаване","Подавания"],"Cron Timezone":["Часова зона за „Cron“"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Delete":["Изтриване"],"Deploy":["Внедряване","Внедрявания"],"Description":["Описание"],"Edit":["Редактиране"],"Edit Pipeline Schedule %{id}":["Редактиране на плана %{id} за схема"],"Failed to change the owner":["Собственикът не може да бъде променен"],"Failed to remove the pipeline schedule":["Планът за схема не може да бъде премахнат"],"Filter":["Филтриране"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Interval Pattern":["Шаблон за интервала"],"Introducing Cycle Analytics":["Представяме Ви анализа на циклите"],"Last %d day":["Последния %d ден","Последните %d дни"],"Last Pipeline":["Последна схема"],"Limited to showing %d event at most":["Ограничено до показване на последното %d събитие","Ограничено до показване на последните %d събития"],"Median":["Медиана"],"New Issue":["Нов проблем","Нови проблема"],"New Pipeline Schedule":["Нов план за схема"],"No schedules":["Няма планове"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"OpenedNDaysAgo|Opened":["Отворен"],"Owner":["Собственик"],"Pipeline Health":["Състояние"],"Pipeline Schedule":["План за схема"],"Pipeline Schedules":["Планове за схема"],"PipelineSchedules|Activated":["Включено"],"PipelineSchedules|Active":["Активно"],"PipelineSchedules|All":["Всички"],"PipelineSchedules|Inactive":["Неактивно"],"PipelineSchedules|Next Run":["Следващо изпълнение"],"PipelineSchedules|None":["Нищо"],"PipelineSchedules|Provide a short description for this pipeline":["Въведете кратко описание за тази схема"],"PipelineSchedules|Take ownership":["Поемане на собствеността"],"PipelineSchedules|Target":["Цел"],"ProjectLifecycle|Stage":["Етап"],"Read more":["Прочетете повече"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани задачи за внедряване"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Save pipeline schedule":["Запазване на плана за схема"],"Schedule a new pipeline":["Създаване на нов план за схема"],"Select a timezone":["Изберете часова зона"],"Select target branch":["Изберете целеви клон"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"Target Branch":["Целеви клон"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"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.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"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.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"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.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия."],"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.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"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.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"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.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнението на първата Ви схема."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"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.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"You need permission.":["Нуждаете се от разрешение."],"day":["ден","дни"]}}}; \ No newline at end of file diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po index fd00796d763..41805a7792e 100644 --- a/locale/bg/gitlab.po +++ b/locale/bg/gitlab.po @@ -3,245 +3,34 @@ msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-12 19:29-0500\n" +"POT-Creation-Date: 2017-06-07 21:22+0200\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-12 09:36-0400\n" +"PO-Revision-Date: 2017-06-10 03:35-0400\n" "Last-Translator: Lyubomir Vasilev \n" -"Language-Team: Bulgarian (https://translate.zanata.org/project/view/GitLab)\n" +"Language-Team: Bulgarian\n" "Language: bg\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -msgid "%{commit_author_link} committed %{commit_timeago}" -msgstr "" - -msgid "About auto deploy" -msgstr "Относно автоматичното внедряване" - -msgid "Active" -msgstr "" - -msgid "Activity" -msgstr "Дейност" - -msgid "Add Changelog" -msgstr "Добавяне на списък с промени" - -msgid "Add Contribution guide" -msgstr "Добавяне на ръководство за сътрудничество" - -msgid "Add License" -msgstr "Добавяне на лиценз" - -msgid "Add an SSH key to your profile to pull or push via SSH." -msgstr "" -"Добавете SSH ключ в профила си, за да можете да изтегляте или изпращате " -"промени чрез SSH." - -msgid "Add new directory" -msgstr "Добавяне на нова папка" - -msgid "Archived project! Repository is read-only" -msgstr "Архивиран проект! Хранилището е само за четене" - msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Наистина ли искате да изтриете този план за схема?" -msgid "Attach a file by drag & drop or %{upload_link}" -msgstr "" - -msgid "Branch" -msgid_plural "Branches" -msgstr[0] "Клон" -msgstr[1] "Клонове" - -msgid "" -"Branch %{branch_name} was created. To set up auto deploy, " -"choose a GitLab CI Yaml template and commit your changes. " -"%{link_to_autodeploy_doc}" -msgstr "" -"Клонът %{branch_name} беше създаден. За да настроите " -"автоматичното внедряване, изберете Yaml шаблон за GitLab CI и подайте " -"промените си. %{link_to_autodeploy_doc}" - -msgid "Branches" -msgstr "Клонове" - -msgid "Browse files" -msgstr "" - msgid "ByAuthor|by" msgstr "от" -msgid "CI configuration" -msgstr "Конфигурация на непрекъсната интеграция" - msgid "Cancel" msgstr "Отказ" -msgid "ChangeTypeActionLabel|Pick into branch" -msgstr "" - -msgid "ChangeTypeActionLabel|Revert in branch" -msgstr "" - -msgid "ChangeTypeAction|Cherry-pick" -msgstr "" - -msgid "ChangeType|commit" -msgstr "" - -msgid "ChangeType|merge request" -msgstr "" - -msgid "Changelog" -msgstr "Списък с промени" - -msgid "Charts" -msgstr "Графики" - -msgid "Cherry-pick this commit" -msgstr "" - -msgid "Cherry-pick this merge-request" -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 "Commit" msgid_plural "Commits" msgstr[0] "Подаване" msgstr[1] "Подавания" -msgid "Commit message" -msgstr "" - -msgid "CommitMessage|Add %{file_name}" -msgstr "Добавяне на „%{file_name}“" - -msgid "Commits" -msgstr "Подавания" - -msgid "Commits|History" -msgstr "История" - -msgid "Committed by" -msgstr "" - -msgid "Compare" -msgstr "Сравнение" - -msgid "Contribution guide" -msgstr "Ръководство за сътрудничество" - -msgid "Contributors" -msgstr "Сътрудници" - -msgid "Copy URL to clipboard" -msgstr "Копиране на адреса в буфера за обмен" - -msgid "Copy commit SHA to clipboard" -msgstr "Копиране на идентификатора на подаването в буфера за обмен" - -msgid "Create New Directory" -msgstr "Създаване на нова папка" - -msgid "Create directory" -msgstr "Създаване на папка" - -msgid "Create empty bare repository" -msgstr "Създаване на празно хранилище" - -msgid "Create merge request" -msgstr "Създаване на заявка за сливане" - -msgid "Create new..." -msgstr "" - -msgid "CreateNewFork|Fork" -msgstr "Разклоняване" - -msgid "CreateTag|Tag" -msgstr "" - msgid "Cron Timezone" msgstr "Часова зона за „Cron“" -msgid "Cron syntax" -msgstr "" - -msgid "Custom" -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 "" -"Персонализираните нива на известяване са същите като нивата за участие. С " -"персонализираните нива на известяване ще можете да получавате и известия за " -"избрани събития. За да научите повече, прегледайте %{notification_link}." - -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." @@ -270,9 +59,6 @@ msgstr "Подготовка за издаване" msgid "CycleAnalyticsStage|Test" msgstr "Тестване" -msgid "Define a custom pattern with cron syntax" -msgstr "" - msgid "Delete" msgstr "Изтриване" @@ -284,68 +70,20 @@ msgstr[1] "Внедрявания" msgid "Description" msgstr "Описание" -msgid "Directory name" -msgstr "Име на папката" - -msgid "Don't show again" -msgstr "Да не се показва повече" - -msgid "Download" -msgstr "Сваляне" - -msgid "Download tar" -msgstr "Сваляне във формат „tar“" - -msgid "Download tar.bz2" -msgstr "Сваляне във формат „tar.bz2“" - -msgid "Download tar.gz" -msgstr "Сваляне във формат „tar.gz“" - -msgid "Download zip" -msgstr "Сваляне във формат „zip“" - -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 "Редактиране на плана %{id} за схема" -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 "Failed to change the owner" msgstr "Собственикът не може да бъде променен" msgid "Failed to remove the pipeline schedule" msgstr "Планът за схема не може да бъде премахнат" -msgid "Files" -msgstr "Файлове" - -msgid "Find by path" -msgstr "Търсене по път" - -msgid "Find file" -msgstr "Търсене на файл" +msgid "Filter" +msgstr "Филтриране" msgid "FirstPushedBy|First" msgstr "Първо" @@ -353,15 +91,6 @@ msgstr "Първо" msgid "FirstPushedBy|pushed by" msgstr "изпращане на промени от" -#, fuzzy -msgid "Fork" -msgid_plural "Forks" -msgstr[0] "Наследяване" -msgstr[1] "" - -msgid "ForkedFromProjectPath|Forked from" -msgstr "Разклонение на" - msgid "From issue creation until deploy to production" msgstr "От създаването на проблема до внедряването в крайната версия" @@ -369,33 +98,12 @@ msgid "From merge request merge until deploy to production" msgstr "" "От прилагането на заявката за сливане до внедряването в крайната версия" -msgid "Go to your fork" -msgstr "Към Вашето разклонение" - -msgid "GoToYourFork|Fork" -msgstr "Разклонение" - -msgid "Home" -msgstr "Начало" - -msgid "Housekeeping successfully started" -msgstr "Освежаването започна успешно" - -msgid "Import repository" -msgstr "Внасяне на хранилище" - msgid "Interval Pattern" msgstr "Шаблон за интервала" msgid "Introducing Cycle Analytics" msgstr "Представяме Ви анализа на циклите" -msgid "LFSStatus|Disabled" -msgstr "Изключено" - -msgid "LFSStatus|Enabled" -msgstr "Включено" - msgid "Last %d day" msgid_plural "Last %d days" msgstr[0] "Последния %d ден" @@ -404,32 +112,14 @@ msgstr[1] "Последните %d дни" msgid "Last Pipeline" msgstr "Последна схема" -msgid "Last Update" -msgstr "Последна промяна" - -msgid "Last commit" -msgstr "Последно подаване" - -msgid "Learn more in the" -msgstr "" - -msgid "Leave group" -msgstr "Напускане на групата" - -msgid "Leave project" -msgstr "Напускане на проекта" - msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" -msgstr[0] "Ограничено до показване на най-много %d събитие" -msgstr[1] "Ограничено до показване на най-много %d събития" +msgstr[0] "Ограничено до показване на последното %d събитие" +msgstr[1] "Ограничено до показване на последните %d събития" msgid "Median" msgstr "Медиана" -msgid "MissingSSHKeyWarningLink|add an SSH key" -msgstr "добавите SSH ключ" - msgid "New Issue" msgid_plural "New Issues" msgstr[0] "Нов проблем" @@ -438,33 +128,6 @@ msgstr[1] "Нови проблема" msgid "New Pipeline Schedule" msgstr "Нов план за схема" -msgid "New branch" -msgstr "Нов клон" - -msgid "New directory" -msgstr "Нова папка" - -msgid "New file" -msgstr "Нов файл" - -msgid "New issue" -msgstr "Нов проблем" - -msgid "New merge request" -msgstr "Нова заявка за сливане" - -msgid "New schedule" -msgstr "" - -msgid "New snippet" -msgstr "Нов отрязък" - -msgid "New tag" -msgstr "Нов етикет" - -msgid "No repository" -msgstr "Няма хранилище" - msgid "No schedules" msgstr "Няма планове" @@ -474,75 +137,12 @@ 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 "OfSearchInADropdown|Filter" -msgstr "" - msgid "OpenedNDaysAgo|Opened" msgstr "Отворен" -msgid "Options" -msgstr "" - msgid "Owner" msgstr "Собственик" -msgid "Pipeline" -msgstr "" - msgid "Pipeline Health" msgstr "Състояние" @@ -579,80 +179,17 @@ msgstr "Поемане на собствеността" msgid "PipelineSchedules|Target" msgstr "Цел" -msgid "Project '%{project_name}' queued for deletion." -msgstr "Проектът „%{project_name}“ е добавен в опашката за изтриване." - -msgid "Project '%{project_name}' was successfully created." -msgstr "Проектът „%{project_name}“ беше създаден успешно." - -msgid "Project '%{project_name}' was successfully updated." -msgstr "Проектът „%{project_name}“ беше обновен успешно." - -msgid "Project '%{project_name}' will be deleted." -msgstr "Проектът „%{project_name}“ ще бъде изтрит." - -msgid "Project access must be granted explicitly to each user." -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 "Project home" -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 "Read more" msgstr "Прочетете повече" -msgid "Readme" -msgstr "ПрочетиМе" - -msgid "RefSwitcher|Branches" -msgstr "Клонове" - -msgid "RefSwitcher|Tags" -msgstr "Етикети" - msgid "Related Commits" msgstr "Свързани подавания" msgid "Related Deployed Jobs" -msgstr "Свързани внедрени задачи" +msgstr "Свързани задачи за внедряване" msgid "Related Issues" msgstr "Свързани проблеми" @@ -666,84 +203,23 @@ msgstr "Свързани заявки за сливане" msgid "Related Merged Requests" msgstr "Свързани приложени заявки за сливане" -msgid "Remind later" -msgstr "Напомняне по-късно" - -msgid "Remove project" -msgstr "Премахване на проекта" - -msgid "Request Access" -msgstr "Заявка за достъп" - -msgid "Revert this commit" -msgstr "" - -msgid "Revert this merge-request" -msgstr "" - msgid "Save pipeline schedule" msgstr "Запазване на плана за схема" msgid "Schedule a new pipeline" msgstr "Създаване на нов план за схема" -msgid "Scheduling Pipelines" -msgstr "" - -msgid "Search branches and tags" -msgstr "Търсене в клоновете и етикетите" - -msgid "Select Archive Format" -msgstr "Изберете формата на архива" - msgid "Select a timezone" msgstr "Изберете часова зона" msgid "Select target branch" msgstr "Изберете целеви клон" -msgid "Set a password on your account to pull or push via %{protocol}" -msgstr "" -"Задайте парола на профила си, за да можете да изтегляте и изпращате промени " -"чрез %{protocol}" - -msgid "Set up CI" -msgstr "Настройка на НИ" - -msgid "Set up Koding" -msgstr "Настройка на „Koding“" - -msgid "Set up auto deploy" -msgstr "Настройка на авт. внедряване" - -msgid "SetPasswordToCloneLink|set a password" -msgstr "зададете парола" - msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "Показване на %d събитие" msgstr[1] "Показване на %d събития" -msgid "Source code" -msgstr "Изходен код" - -msgid "StarProject|Star" -msgstr "Звезда" - -msgid "Start a new merge request with these changes" -msgstr "" - -msgid "Switch branch/tag" -msgstr "Преминаване към клон/етикет" - -msgid "Tag" -msgid_plural "Tags" -msgstr[0] "Етикет" -msgstr[1] "Етикети" - -msgid "Tags" -msgstr "Етикети" - msgid "Target Branch" msgstr "Целеви клон" @@ -759,9 +235,6 @@ 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. " @@ -775,12 +248,6 @@ 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 " @@ -796,18 +263,7 @@ msgid "" "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 " @@ -849,13 +305,6 @@ msgstr "" "данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е " "(5+7)/2 = 6." -msgid "" -"This means you can not push code until you create an empty repository or " -"import existing one." -msgstr "" -"Това означава, че няма да можете да изпращате код, докато не създадете " -"празно хранилище или не внесете съществуващо такова." - msgid "Time before an issue gets scheduled" msgstr "Време преди един проблем да бъде планиран за работа" @@ -869,129 +318,6 @@ msgstr "" msgid "Time until first merge request" msgstr "Време преди първата заявка за сливане" -msgid "Timeago|%s days ago" -msgstr "преди %s дни" - -msgid "Timeago|%s days remaining" -msgstr "остават %s дни" - -msgid "Timeago|%s hours remaining" -msgstr "остават %s часа" - -msgid "Timeago|%s minutes ago" -msgstr "преди %s минути" - -msgid "Timeago|%s minutes remaining" -msgstr "остават %s минути" - -msgid "Timeago|%s months ago" -msgstr "преди %s месеца" - -msgid "Timeago|%s months remaining" -msgstr "остават %s месеца" - -msgid "Timeago|%s seconds remaining" -msgstr "остават %s секунди" - -msgid "Timeago|%s weeks ago" -msgstr "преди %s седмици" - -msgid "Timeago|%s weeks remaining" -msgstr "остават %s седмици" - -msgid "Timeago|%s years ago" -msgstr "преди %s години" - -msgid "Timeago|%s years remaining" -msgstr "остават %s години" - -msgid "Timeago|1 day remaining" -msgstr "остава 1 ден" - -msgid "Timeago|1 hour remaining" -msgstr "остава 1 час" - -msgid "Timeago|1 minute remaining" -msgstr "остава 1 минута" - -msgid "Timeago|1 month remaining" -msgstr "остава 1 месец" - -msgid "Timeago|1 week remaining" -msgstr "остава 1 седмица" - -msgid "Timeago|1 year remaining" -msgstr "остава 1 година" - -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 while" -msgstr "преди известно време" - -msgid "Timeago|a year ago" -msgstr "преди една година" - -msgid "Timeago|about %s hours ago" -msgstr "преди около %s часа" - -msgid "Timeago|about a minute ago" -msgstr "преди около една минута" - -msgid "Timeago|about an hour ago" -msgstr "преди около един час" - -msgid "Timeago|in %s days" -msgstr "след %s дни" - -msgid "Timeago|in %s hours" -msgstr "след %s часа" - -msgid "Timeago|in %s minutes" -msgstr "след %s минути" - -msgid "Timeago|in %s months" -msgstr "след %s месеца" - -msgid "Timeago|in %s seconds" -msgstr "след %s секунди" - -msgid "Timeago|in %s weeks" -msgstr "след %s седмици" - -msgid "Timeago|in %s years" -msgstr "след %s години" - -msgid "Timeago|in 1 day" -msgstr "след 1 ден" - -msgid "Timeago|in 1 hour" -msgstr "след 1 час" - -msgid "Timeago|in 1 minute" -msgstr "след 1 минута" - -msgid "Timeago|in 1 month" -msgstr "след 1 месец" - -msgid "Timeago|in 1 week" -msgstr "след 1 седмица" - -msgid "Timeago|in 1 year" -msgstr "след 1 година" - -msgid "Timeago|less than a minute ago" -msgstr "преди по-малко от минута" - msgid "Time|hr" msgid_plural "Time|hrs" msgstr[0] "час" @@ -1011,119 +337,17 @@ msgstr "Общо време" msgid "Total test time for all commits/merges" msgstr "Общо време за тестване на всички подавания/сливания" -msgid "Unstar" -msgstr "Без звезда" - -msgid "Upload New File" -msgstr "Качване на нов файл" - -msgid "Upload file" -msgstr "Качване на файл" - -msgid "Use your global notification setting" -msgstr "Използване на глобалната Ви настройка за известията" - -msgid "VisibilityLevel|Internal" -msgstr "Вътрешен" - -msgid "VisibilityLevel|Private" -msgstr "Частен" - -msgid "VisibilityLevel|Public" -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 "Withdraw Access Request" -msgstr "Оттегляне на заявката за достъп" - -msgid "" -"You are going to remove %{project_name_with_namespace}.\n" -"Removed project CANNOT be restored!\n" -"Are you ABSOLUTELY sure?" -msgstr "" -"На път сте да премахнете „%{project_name_with_namespace}“.\n" -"Ако го премахнете, той НЕ може да бъде възстановен!\n" -"НАИСТИНА ли искате това?" - -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 "" -"На път сте да прехвърлите „%{project_name_with_namespace}“ към друг " -"собственик. НАИСТИНА ли искате това?" - -msgid "You can only add files when you are on a branch" -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 "" -"Няма да можете да изтегляте или изпращате код в проекта чрез %{protocol}, " -"докато не %{set_password_link} за профила си" - -msgid "" -"You won't be able to pull or push project code via SSH until you " -"%{add_ssh_key_link} to your profile" -msgstr "" -"Няма да можете да изтегляте или изпращате код в проекта чрез SSH, докато не " -"%{add_ssh_key_link} в профила си" - -msgid "Your name" -msgstr "Вашето име" - msgid "day" msgid_plural "days" msgstr[0] "ден" msgstr[1] "дни" -msgid "notification emails" -msgstr "известия по е-поща" - -msgid "parent" -msgid_plural "parents" -msgstr[0] "" -msgstr[1] "" - -msgid "pipeline schedules documentation" -msgstr "" - -msgid "with stage" -msgid_plural "with stages" -msgstr[0] "" -msgstr[1] "" - From 66b0bce9c6f9b4c338a5cf11797190a3d6dc39d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 13 Jun 2017 11:22:51 +0800 Subject: [PATCH 0074/1380] Optimization 'bg' translation 1. Fix missing translations --- app/assets/javascripts/locale/bg/app.js | 2 +- locale/bg/gitlab.po | 794 +++++++++++++++++++++++- 2 files changed, 786 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/locale/bg/app.js b/app/assets/javascripts/locale/bg/app.js index f1fedb546de..33a5c3c7eb9 100644 --- a/app/assets/javascripts/locale/bg/app.js +++ b/app/assets/javascripts/locale/bg/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-07 21:22+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-10 03:35-0400","Last-Translator":"Lyubomir Vasilev ","Language-Team":"Bulgarian","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"Are you sure you want to delete this pipeline schedule?":["Наистина ли искате да изтриете този план за схема?"],"ByAuthor|by":["от"],"Cancel":["Отказ"],"Commit":["Подаване","Подавания"],"Cron Timezone":["Часова зона за „Cron“"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Delete":["Изтриване"],"Deploy":["Внедряване","Внедрявания"],"Description":["Описание"],"Edit":["Редактиране"],"Edit Pipeline Schedule %{id}":["Редактиране на плана %{id} за схема"],"Failed to change the owner":["Собственикът не може да бъде променен"],"Failed to remove the pipeline schedule":["Планът за схема не може да бъде премахнат"],"Filter":["Филтриране"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Interval Pattern":["Шаблон за интервала"],"Introducing Cycle Analytics":["Представяме Ви анализа на циклите"],"Last %d day":["Последния %d ден","Последните %d дни"],"Last Pipeline":["Последна схема"],"Limited to showing %d event at most":["Ограничено до показване на последното %d събитие","Ограничено до показване на последните %d събития"],"Median":["Медиана"],"New Issue":["Нов проблем","Нови проблема"],"New Pipeline Schedule":["Нов план за схема"],"No schedules":["Няма планове"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"OpenedNDaysAgo|Opened":["Отворен"],"Owner":["Собственик"],"Pipeline Health":["Състояние"],"Pipeline Schedule":["План за схема"],"Pipeline Schedules":["Планове за схема"],"PipelineSchedules|Activated":["Включено"],"PipelineSchedules|Active":["Активно"],"PipelineSchedules|All":["Всички"],"PipelineSchedules|Inactive":["Неактивно"],"PipelineSchedules|Next Run":["Следващо изпълнение"],"PipelineSchedules|None":["Нищо"],"PipelineSchedules|Provide a short description for this pipeline":["Въведете кратко описание за тази схема"],"PipelineSchedules|Take ownership":["Поемане на собствеността"],"PipelineSchedules|Target":["Цел"],"ProjectLifecycle|Stage":["Етап"],"Read more":["Прочетете повече"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани задачи за внедряване"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Save pipeline schedule":["Запазване на плана за схема"],"Schedule a new pipeline":["Създаване на нов план за схема"],"Select a timezone":["Изберете часова зона"],"Select target branch":["Изберете целеви клон"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"Target Branch":["Целеви клон"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"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.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"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.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"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.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия."],"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.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"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.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"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.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнението на първата Ви схема."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"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.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"You need permission.":["Нуждаете се от разрешение."],"day":["ден","дни"]}}}; \ No newline at end of file +var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-12 09:36-0400","Last-Translator":"Lyubomir Vasilev ","Language-Team":"Bulgarian (https://translate.zanata.org/project/view/GitLab)","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"%{commit_author_link} committed %{commit_timeago}":[""],"About auto deploy":["Относно автоматичното внедряване"],"Active":[""],"Activity":["Дейност"],"Add Changelog":["Добавяне на списък с промени"],"Add Contribution guide":["Добавяне на ръководство за сътрудничество"],"Add License":["Добавяне на лиценз"],"Add an SSH key to your profile to pull or push via SSH.":["Добавете SSH ключ в профила си, за да можете да изтегляте или изпращате промени чрез SSH."],"Add new directory":["Добавяне на нова папка"],"Archived project! Repository is read-only":["Архивиран проект! Хранилището е само за четене"],"Are you sure you want to delete this pipeline schedule?":["Наистина ли искате да изтриете този план за схема?"],"Attach a file by drag & drop or %{upload_link}":[""],"Branch":["Клон","Клонове"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["Клонът %{branch_name} беше създаден. За да настроите автоматичното внедряване, изберете Yaml шаблон за GitLab CI и подайте промените си. %{link_to_autodeploy_doc}"],"Branches":["Клонове"],"Browse files":[""],"ByAuthor|by":["от"],"CI configuration":["Конфигурация на непрекъсната интеграция"],"Cancel":["Отказ"],"ChangeTypeActionLabel|Pick into branch":[""],"ChangeTypeActionLabel|Revert in branch":[""],"ChangeTypeAction|Cherry-pick":[""],"ChangeType|commit":[""],"ChangeType|merge request":[""],"Changelog":["Списък с промени"],"Charts":["Графики"],"Cherry-pick this commit":[""],"Cherry-pick this merge-request":[""],"CiStatusLabel|canceled":["отказано"],"CiStatusLabel|created":["създадено"],"CiStatusLabel|failed":["неуспешно"],"CiStatusLabel|manual action":["ръчно действие"],"CiStatusLabel|passed":["успешно"],"CiStatusLabel|passed with warnings":["успешно, с предупреждения"],"CiStatusLabel|pending":["на изчакване"],"CiStatusLabel|skipped":["пропуснато"],"CiStatusLabel|waiting for manual action":["чакане за ръчно действие"],"CiStatusText|blocked":["блокирано"],"CiStatusText|canceled":["отказано"],"CiStatusText|created":["създадено"],"CiStatusText|failed":["неуспешно"],"CiStatusText|manual":["ръчно"],"CiStatusText|passed":["успешно"],"CiStatusText|pending":["на изчакване"],"CiStatusText|skipped":["пропуснато"],"CiStatus|running":["протича в момента"],"Commit":["Подаване","Подавания"],"Commit message":[""],"CommitMessage|Add %{file_name}":["Добавяне на „%{file_name}“"],"Commits":["Подавания"],"Commits|History":["История"],"Committed by":[""],"Compare":["Сравнение"],"Contribution guide":["Ръководство за сътрудничество"],"Contributors":["Сътрудници"],"Copy URL to clipboard":["Копиране на адреса в буфера за обмен"],"Copy commit SHA to clipboard":["Копиране на идентификатора на подаването в буфера за обмен"],"Create New Directory":["Създаване на нова папка"],"Create directory":["Създаване на папка"],"Create empty bare repository":["Създаване на празно хранилище"],"Create merge request":["Създаване на заявка за сливане"],"Create new...":[""],"CreateNewFork|Fork":["Разклоняване"],"CreateTag|Tag":[""],"Cron Timezone":["Часова зона за „Cron“"],"Cron syntax":[""],"Custom":[""],"Custom notification events":["Персонализирани събития за известяване"],"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}.":["Персонализираните нива на известяване са същите като нивата за участие. С персонализираните нива на известяване ще можете да получавате и известия за избрани събития. За да научите повече, прегледайте %{notification_link}."],"Cycle Analytics":["Анализ на циклите"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Define a custom pattern with cron syntax":[""],"Delete":["Изтриване"],"Deploy":["Внедряване","Внедрявания"],"Description":["Описание"],"Directory name":["Име на папката"],"Don't show again":["Да не се показва повече"],"Download":["Сваляне"],"Download tar":["Сваляне във формат „tar“"],"Download tar.bz2":["Сваляне във формат „tar.bz2“"],"Download tar.gz":["Сваляне във формат „tar.gz“"],"Download zip":["Сваляне във формат „zip“"],"DownloadArtifacts|Download":["Сваляне"],"DownloadCommit|Email Patches":[""],"DownloadCommit|Plain Diff":[""],"DownloadSource|Download":["Сваляне"],"Edit":["Редактиране"],"Edit Pipeline Schedule %{id}":["Редактиране на плана %{id} за схема"],"Every day (at 4:00am)":[""],"Every month (on the 1st at 4:00am)":[""],"Every week (Sundays at 4:00am)":[""],"Failed to change the owner":["Собственикът не може да бъде променен"],"Failed to remove the pipeline schedule":["Планът за схема не може да бъде премахнат"],"Files":["Файлове"],"Find by path":["Търсене по път"],"Find file":["Търсене на файл"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"Fork":["Наследяване",""],"ForkedFromProjectPath|Forked from":["Разклонение на"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Go to your fork":["Към Вашето разклонение"],"GoToYourFork|Fork":["Разклонение"],"Home":["Начало"],"Housekeeping successfully started":["Освежаването започна успешно"],"Import repository":["Внасяне на хранилище"],"Interval Pattern":["Шаблон за интервала"],"Introducing Cycle Analytics":["Представяме Ви анализа на циклите"],"LFSStatus|Disabled":["Изключено"],"LFSStatus|Enabled":["Включено"],"Last %d day":["Последния %d ден","Последните %d дни"],"Last Pipeline":["Последна схема"],"Last Update":["Последна промяна"],"Last commit":["Последно подаване"],"Learn more in the":[""],"Leave group":["Напускане на групата"],"Leave project":["Напускане на проекта"],"Limited to showing %d event at most":["Ограничено до показване на най-много %d събитие","Ограничено до показване на най-много %d събития"],"Median":["Медиана"],"MissingSSHKeyWarningLink|add an SSH key":["добавите SSH ключ"],"New Issue":["Нов проблем","Нови проблема"],"New Pipeline Schedule":["Нов план за схема"],"New branch":["Нов клон"],"New directory":["Нова папка"],"New file":["Нов файл"],"New issue":["Нов проблем"],"New merge request":["Нова заявка за сливане"],"New schedule":[""],"New snippet":["Нов отрязък"],"New tag":["Нов етикет"],"No repository":["Няма хранилище"],"No schedules":["Няма планове"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"Notification events":["Събития за известяване"],"NotificationEvent|Close issue":["Затваряне на проблем"],"NotificationEvent|Close merge request":["Затваряне на заявка за сливане"],"NotificationEvent|Failed pipeline":["Неуспешно изпълнение на схема"],"NotificationEvent|Merge merge request":["Прилагане на заявка за сливане"],"NotificationEvent|New issue":["Нов проблем"],"NotificationEvent|New merge request":["Нова заявка за сливане"],"NotificationEvent|New note":["Нова бележка"],"NotificationEvent|Reassign issue":["Преназначаване на проблем"],"NotificationEvent|Reassign merge request":["Преназначаване на заявка за сливане"],"NotificationEvent|Reopen issue":["Повторно отваряне на проблем"],"NotificationEvent|Successful pipeline":["Успешно изпълнение на схема"],"NotificationLevel|Custom":["Персонализирани"],"NotificationLevel|Disabled":["Изключени"],"NotificationLevel|Global":["Глобални"],"NotificationLevel|On mention":["При споменаване"],"NotificationLevel|Participate":["Участие"],"NotificationLevel|Watch":["Наблюдение"],"OfSearchInADropdown|Filter":[""],"OpenedNDaysAgo|Opened":["Отворен"],"Options":[""],"Owner":["Собственик"],"Pipeline":[""],"Pipeline Health":["Състояние"],"Pipeline Schedule":["План за схема"],"Pipeline Schedules":["Планове за схема"],"PipelineSchedules|Activated":["Включено"],"PipelineSchedules|Active":["Активно"],"PipelineSchedules|All":["Всички"],"PipelineSchedules|Inactive":["Неактивно"],"PipelineSchedules|Next Run":["Следващо изпълнение"],"PipelineSchedules|None":["Нищо"],"PipelineSchedules|Provide a short description for this pipeline":["Въведете кратко описание за тази схема"],"PipelineSchedules|Take ownership":["Поемане на собствеността"],"PipelineSchedules|Target":["Цел"],"Project '%{project_name}' queued for deletion.":["Проектът „%{project_name}“ е добавен в опашката за изтриване."],"Project '%{project_name}' was successfully created.":["Проектът „%{project_name}“ беше създаден успешно."],"Project '%{project_name}' was successfully updated.":["Проектът „%{project_name}“ беше обновен успешно."],"Project '%{project_name}' will be deleted.":["Проектът „%{project_name}“ ще бъде изтрит."],"Project access must be granted explicitly to each user.":["Достъпът до проекта трябва да бъде даван поотделно на всеки потребител."],"Project export could not be deleted.":["Изнесените данни на проекта не могат да бъдат изтрити."],"Project export has been deleted.":["Изнесените данни на проекта бяха изтрити."],"Project export link has expired. Please generate a new export from your project settings.":["Връзката към изнесените данни на проекта изгуби давност. Моля, създайте нова от настройките на проекта."],"Project export started. A download link will be sent by email.":["Изнасянето на проекта започна. Ще получите връзка към данните по е-поща."],"Project home":["Начална страница на проекта"],"ProjectFeature|Disabled":["Изключено"],"ProjectFeature|Everyone with access":["Всеки с достъп"],"ProjectFeature|Only team members":["Само членовете на екипа"],"ProjectFileTree|Name":["Име"],"ProjectLastActivity|Never":["Никога"],"ProjectLifecycle|Stage":["Етап"],"ProjectNetworkGraph|Graph":["Графика"],"Read more":["Прочетете повече"],"Readme":["ПрочетиМе"],"RefSwitcher|Branches":["Клонове"],"RefSwitcher|Tags":["Етикети"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани внедрени задачи"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Remind later":["Напомняне по-късно"],"Remove project":["Премахване на проекта"],"Request Access":["Заявка за достъп"],"Revert this commit":[""],"Revert this merge-request":[""],"Save pipeline schedule":["Запазване на плана за схема"],"Schedule a new pipeline":["Създаване на нов план за схема"],"Scheduling Pipelines":[""],"Search branches and tags":["Търсене в клоновете и етикетите"],"Select Archive Format":["Изберете формата на архива"],"Select a timezone":["Изберете часова зона"],"Select target branch":["Изберете целеви клон"],"Set a password on your account to pull or push via %{protocol}":["Задайте парола на профила си, за да можете да изтегляте и изпращате промени чрез %{protocol}"],"Set up CI":["Настройка на НИ"],"Set up Koding":["Настройка на „Koding“"],"Set up auto deploy":["Настройка на авт. внедряване"],"SetPasswordToCloneLink|set a password":["зададете парола"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"Source code":["Изходен код"],"StarProject|Star":["Звезда"],"Start a new merge request with these changes":[""],"Switch branch/tag":["Преминаване към клон/етикет"],"Tag":["Етикет","Етикети"],"Tags":["Етикети"],"Target Branch":["Целеви клон"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"The fork relationship has been removed.":["Връзката на разклонение беше премахната."],"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.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"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.":[""],"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.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"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.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия. Данните ще бъдат добавени автоматично след като завършите един пълен цикъл и превърнете първата си идея в реалност."],"The project can be accessed by any logged in user.":["Всеки вписан потребител има достъп до проекта."],"The project can be accessed without any authentication.":["Всеки може да има достъп до проекта, без нужда от удостоверяване."],"The repository for this project does not exist.":["Хранилището за този проект не съществува."],"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.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"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.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"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.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнението на първата Ви схема."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"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.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"This means you can not push code until you create an empty repository or import existing one.":["Това означава, че няма да можете да изпращате код, докато не създадете празно хранилище или не внесете съществуващо такова."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Timeago|%s days ago":["преди %s дни"],"Timeago|%s days remaining":["остават %s дни"],"Timeago|%s hours remaining":["остават %s часа"],"Timeago|%s minutes ago":["преди %s минути"],"Timeago|%s minutes remaining":["остават %s минути"],"Timeago|%s months ago":["преди %s месеца"],"Timeago|%s months remaining":["остават %s месеца"],"Timeago|%s seconds remaining":["остават %s секунди"],"Timeago|%s weeks ago":["преди %s седмици"],"Timeago|%s weeks remaining":["остават %s седмици"],"Timeago|%s years ago":["преди %s години"],"Timeago|%s years remaining":["остават %s години"],"Timeago|1 day remaining":["остава 1 ден"],"Timeago|1 hour remaining":["остава 1 час"],"Timeago|1 minute remaining":["остава 1 минута"],"Timeago|1 month remaining":["остава 1 месец"],"Timeago|1 week remaining":["остава 1 седмица"],"Timeago|1 year remaining":["остава 1 година"],"Timeago|Past due":["Просрочено"],"Timeago|a day ago":["преди един ден"],"Timeago|a month ago":["преди един месец"],"Timeago|a week ago":["преди една седмица"],"Timeago|a while":["преди известно време"],"Timeago|a year ago":["преди една година"],"Timeago|about %s hours ago":["преди около %s часа"],"Timeago|about a minute ago":["преди около една минута"],"Timeago|about an hour ago":["преди около един час"],"Timeago|in %s days":["след %s дни"],"Timeago|in %s hours":["след %s часа"],"Timeago|in %s minutes":["след %s минути"],"Timeago|in %s months":["след %s месеца"],"Timeago|in %s seconds":["след %s секунди"],"Timeago|in %s weeks":["след %s седмици"],"Timeago|in %s years":["след %s години"],"Timeago|in 1 day":["след 1 ден"],"Timeago|in 1 hour":["след 1 час"],"Timeago|in 1 minute":["след 1 минута"],"Timeago|in 1 month":["след 1 месец"],"Timeago|in 1 week":["след 1 седмица"],"Timeago|in 1 year":["след 1 година"],"Timeago|less than a minute ago":["преди по-малко от минута"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Unstar":["Без звезда"],"Upload New File":["Качване на нов файл"],"Upload file":["Качване на файл"],"Use your global notification setting":["Използване на глобалната Ви настройка за известията"],"VisibilityLevel|Internal":["Вътрешен"],"VisibilityLevel|Private":["Частен"],"VisibilityLevel|Public":["Публичен"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"Withdraw Access Request":["Оттегляне на заявката за достъп"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["На път сте да премахнете „%{project_name_with_namespace}“.\\nАко го премахнете, той НЕ може да бъде възстановен!\\nНАИСТИНА ли искате това?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":[""],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["На път сте да прехвърлите „%{project_name_with_namespace}“ към друг собственик. НАИСТИНА ли искате това?"],"You can only add files when you are on a branch":["Можете да добавяте файлове само когато се намирате в клон"],"You must sign in to star a project":["Трябва да се впишете, за да отбележите проект със звезда"],"You need permission.":["Нуждаете се от разрешение."],"You will not get any notifications via email":["Няма да получавате никакви известия по е-поща"],"You will only receive notifications for the events you choose":["Ще получавате известия само за събитията, за които желаете"],"You will only receive notifications for threads you have participated in":["Ще получавате известия само за нещата, в които участвате"],"You will receive notifications for any activity":["Ще получавате известия за всяка дейност"],"You will receive notifications only for comments in which you were @mentioned":["Ще получавате известия само за коментари, в които Ви @споменават"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["Няма да можете да изтегляте или изпращате код в проекта чрез %{protocol}, докато не %{set_password_link} за профила си"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["Няма да можете да изтегляте или изпращате код в проекта чрез SSH, докато не %{add_ssh_key_link} в профила си"],"Your name":["Вашето име"],"day":["ден","дни"],"notification emails":["известия по е-поща"],"parent":["",""],"pipeline schedules documentation":[""],"with stage":["",""]}}}; \ No newline at end of file diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po index 41805a7792e..fd00796d763 100644 --- a/locale/bg/gitlab.po +++ b/locale/bg/gitlab.po @@ -3,34 +3,245 @@ msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-07 21:22+0200\n" +"POT-Creation-Date: 2017-06-12 19:29-0500\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-10 03:35-0400\n" +"PO-Revision-Date: 2017-06-12 09:36-0400\n" "Last-Translator: Lyubomir Vasilev \n" -"Language-Team: Bulgarian\n" +"Language-Team: Bulgarian (https://translate.zanata.org/project/view/GitLab)\n" "Language: bg\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +msgid "%{commit_author_link} committed %{commit_timeago}" +msgstr "" + +msgid "About auto deploy" +msgstr "Относно автоматичното внедряване" + +msgid "Active" +msgstr "" + +msgid "Activity" +msgstr "Дейност" + +msgid "Add Changelog" +msgstr "Добавяне на списък с промени" + +msgid "Add Contribution guide" +msgstr "Добавяне на ръководство за сътрудничество" + +msgid "Add License" +msgstr "Добавяне на лиценз" + +msgid "Add an SSH key to your profile to pull or push via SSH." +msgstr "" +"Добавете SSH ключ в профила си, за да можете да изтегляте или изпращате " +"промени чрез SSH." + +msgid "Add new directory" +msgstr "Добавяне на нова папка" + +msgid "Archived project! Repository is read-only" +msgstr "Архивиран проект! Хранилището е само за четене" + msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Наистина ли искате да изтриете този план за схема?" +msgid "Attach a file by drag & drop or %{upload_link}" +msgstr "" + +msgid "Branch" +msgid_plural "Branches" +msgstr[0] "Клон" +msgstr[1] "Клонове" + +msgid "" +"Branch %{branch_name} was created. To set up auto deploy, " +"choose a GitLab CI Yaml template and commit your changes. " +"%{link_to_autodeploy_doc}" +msgstr "" +"Клонът %{branch_name} беше създаден. За да настроите " +"автоматичното внедряване, изберете Yaml шаблон за GitLab CI и подайте " +"промените си. %{link_to_autodeploy_doc}" + +msgid "Branches" +msgstr "Клонове" + +msgid "Browse files" +msgstr "" + msgid "ByAuthor|by" msgstr "от" +msgid "CI configuration" +msgstr "Конфигурация на непрекъсната интеграция" + msgid "Cancel" msgstr "Отказ" +msgid "ChangeTypeActionLabel|Pick into branch" +msgstr "" + +msgid "ChangeTypeActionLabel|Revert in branch" +msgstr "" + +msgid "ChangeTypeAction|Cherry-pick" +msgstr "" + +msgid "ChangeType|commit" +msgstr "" + +msgid "ChangeType|merge request" +msgstr "" + +msgid "Changelog" +msgstr "Списък с промени" + +msgid "Charts" +msgstr "Графики" + +msgid "Cherry-pick this commit" +msgstr "" + +msgid "Cherry-pick this merge-request" +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 "Commit" msgid_plural "Commits" msgstr[0] "Подаване" msgstr[1] "Подавания" +msgid "Commit message" +msgstr "" + +msgid "CommitMessage|Add %{file_name}" +msgstr "Добавяне на „%{file_name}“" + +msgid "Commits" +msgstr "Подавания" + +msgid "Commits|History" +msgstr "История" + +msgid "Committed by" +msgstr "" + +msgid "Compare" +msgstr "Сравнение" + +msgid "Contribution guide" +msgstr "Ръководство за сътрудничество" + +msgid "Contributors" +msgstr "Сътрудници" + +msgid "Copy URL to clipboard" +msgstr "Копиране на адреса в буфера за обмен" + +msgid "Copy commit SHA to clipboard" +msgstr "Копиране на идентификатора на подаването в буфера за обмен" + +msgid "Create New Directory" +msgstr "Създаване на нова папка" + +msgid "Create directory" +msgstr "Създаване на папка" + +msgid "Create empty bare repository" +msgstr "Създаване на празно хранилище" + +msgid "Create merge request" +msgstr "Създаване на заявка за сливане" + +msgid "Create new..." +msgstr "" + +msgid "CreateNewFork|Fork" +msgstr "Разклоняване" + +msgid "CreateTag|Tag" +msgstr "" + msgid "Cron Timezone" msgstr "Часова зона за „Cron“" +msgid "Cron syntax" +msgstr "" + +msgid "Custom" +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 "" +"Персонализираните нива на известяване са същите като нивата за участие. С " +"персонализираните нива на известяване ще можете да получавате и известия за " +"избрани събития. За да научите повече, прегледайте %{notification_link}." + +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." @@ -59,6 +270,9 @@ msgstr "Подготовка за издаване" msgid "CycleAnalyticsStage|Test" msgstr "Тестване" +msgid "Define a custom pattern with cron syntax" +msgstr "" + msgid "Delete" msgstr "Изтриване" @@ -70,20 +284,68 @@ msgstr[1] "Внедрявания" msgid "Description" msgstr "Описание" +msgid "Directory name" +msgstr "Име на папката" + +msgid "Don't show again" +msgstr "Да не се показва повече" + +msgid "Download" +msgstr "Сваляне" + +msgid "Download tar" +msgstr "Сваляне във формат „tar“" + +msgid "Download tar.bz2" +msgstr "Сваляне във формат „tar.bz2“" + +msgid "Download tar.gz" +msgstr "Сваляне във формат „tar.gz“" + +msgid "Download zip" +msgstr "Сваляне във формат „zip“" + +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 "Редактиране на плана %{id} за схема" +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 "Failed to change the owner" msgstr "Собственикът не може да бъде променен" msgid "Failed to remove the pipeline schedule" msgstr "Планът за схема не може да бъде премахнат" -msgid "Filter" -msgstr "Филтриране" +msgid "Files" +msgstr "Файлове" + +msgid "Find by path" +msgstr "Търсене по път" + +msgid "Find file" +msgstr "Търсене на файл" msgid "FirstPushedBy|First" msgstr "Първо" @@ -91,6 +353,15 @@ msgstr "Първо" msgid "FirstPushedBy|pushed by" msgstr "изпращане на промени от" +#, fuzzy +msgid "Fork" +msgid_plural "Forks" +msgstr[0] "Наследяване" +msgstr[1] "" + +msgid "ForkedFromProjectPath|Forked from" +msgstr "Разклонение на" + msgid "From issue creation until deploy to production" msgstr "От създаването на проблема до внедряването в крайната версия" @@ -98,12 +369,33 @@ msgid "From merge request merge until deploy to production" msgstr "" "От прилагането на заявката за сливане до внедряването в крайната версия" +msgid "Go to your fork" +msgstr "Към Вашето разклонение" + +msgid "GoToYourFork|Fork" +msgstr "Разклонение" + +msgid "Home" +msgstr "Начало" + +msgid "Housekeeping successfully started" +msgstr "Освежаването започна успешно" + +msgid "Import repository" +msgstr "Внасяне на хранилище" + msgid "Interval Pattern" msgstr "Шаблон за интервала" msgid "Introducing Cycle Analytics" msgstr "Представяме Ви анализа на циклите" +msgid "LFSStatus|Disabled" +msgstr "Изключено" + +msgid "LFSStatus|Enabled" +msgstr "Включено" + msgid "Last %d day" msgid_plural "Last %d days" msgstr[0] "Последния %d ден" @@ -112,14 +404,32 @@ msgstr[1] "Последните %d дни" msgid "Last Pipeline" msgstr "Последна схема" +msgid "Last Update" +msgstr "Последна промяна" + +msgid "Last commit" +msgstr "Последно подаване" + +msgid "Learn more in the" +msgstr "" + +msgid "Leave group" +msgstr "Напускане на групата" + +msgid "Leave project" +msgstr "Напускане на проекта" + msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" -msgstr[0] "Ограничено до показване на последното %d събитие" -msgstr[1] "Ограничено до показване на последните %d събития" +msgstr[0] "Ограничено до показване на най-много %d събитие" +msgstr[1] "Ограничено до показване на най-много %d събития" msgid "Median" msgstr "Медиана" +msgid "MissingSSHKeyWarningLink|add an SSH key" +msgstr "добавите SSH ключ" + msgid "New Issue" msgid_plural "New Issues" msgstr[0] "Нов проблем" @@ -128,6 +438,33 @@ msgstr[1] "Нови проблема" msgid "New Pipeline Schedule" msgstr "Нов план за схема" +msgid "New branch" +msgstr "Нов клон" + +msgid "New directory" +msgstr "Нова папка" + +msgid "New file" +msgstr "Нов файл" + +msgid "New issue" +msgstr "Нов проблем" + +msgid "New merge request" +msgstr "Нова заявка за сливане" + +msgid "New schedule" +msgstr "" + +msgid "New snippet" +msgstr "Нов отрязък" + +msgid "New tag" +msgstr "Нов етикет" + +msgid "No repository" +msgstr "Няма хранилище" + msgid "No schedules" msgstr "Няма планове" @@ -137,12 +474,75 @@ 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 "OfSearchInADropdown|Filter" +msgstr "" + msgid "OpenedNDaysAgo|Opened" msgstr "Отворен" +msgid "Options" +msgstr "" + msgid "Owner" msgstr "Собственик" +msgid "Pipeline" +msgstr "" + msgid "Pipeline Health" msgstr "Състояние" @@ -179,17 +579,80 @@ msgstr "Поемане на собствеността" msgid "PipelineSchedules|Target" msgstr "Цел" +msgid "Project '%{project_name}' queued for deletion." +msgstr "Проектът „%{project_name}“ е добавен в опашката за изтриване." + +msgid "Project '%{project_name}' was successfully created." +msgstr "Проектът „%{project_name}“ беше създаден успешно." + +msgid "Project '%{project_name}' was successfully updated." +msgstr "Проектът „%{project_name}“ беше обновен успешно." + +msgid "Project '%{project_name}' will be deleted." +msgstr "Проектът „%{project_name}“ ще бъде изтрит." + +msgid "Project access must be granted explicitly to each user." +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 "Project home" +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 "Read more" msgstr "Прочетете повече" +msgid "Readme" +msgstr "ПрочетиМе" + +msgid "RefSwitcher|Branches" +msgstr "Клонове" + +msgid "RefSwitcher|Tags" +msgstr "Етикети" + msgid "Related Commits" msgstr "Свързани подавания" msgid "Related Deployed Jobs" -msgstr "Свързани задачи за внедряване" +msgstr "Свързани внедрени задачи" msgid "Related Issues" msgstr "Свързани проблеми" @@ -203,23 +666,84 @@ msgstr "Свързани заявки за сливане" msgid "Related Merged Requests" msgstr "Свързани приложени заявки за сливане" +msgid "Remind later" +msgstr "Напомняне по-късно" + +msgid "Remove project" +msgstr "Премахване на проекта" + +msgid "Request Access" +msgstr "Заявка за достъп" + +msgid "Revert this commit" +msgstr "" + +msgid "Revert this merge-request" +msgstr "" + msgid "Save pipeline schedule" msgstr "Запазване на плана за схема" msgid "Schedule a new pipeline" msgstr "Създаване на нов план за схема" +msgid "Scheduling Pipelines" +msgstr "" + +msgid "Search branches and tags" +msgstr "Търсене в клоновете и етикетите" + +msgid "Select Archive Format" +msgstr "Изберете формата на архива" + msgid "Select a timezone" msgstr "Изберете часова зона" msgid "Select target branch" msgstr "Изберете целеви клон" +msgid "Set a password on your account to pull or push via %{protocol}" +msgstr "" +"Задайте парола на профила си, за да можете да изтегляте и изпращате промени " +"чрез %{protocol}" + +msgid "Set up CI" +msgstr "Настройка на НИ" + +msgid "Set up Koding" +msgstr "Настройка на „Koding“" + +msgid "Set up auto deploy" +msgstr "Настройка на авт. внедряване" + +msgid "SetPasswordToCloneLink|set a password" +msgstr "зададете парола" + msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "Показване на %d събитие" msgstr[1] "Показване на %d събития" +msgid "Source code" +msgstr "Изходен код" + +msgid "StarProject|Star" +msgstr "Звезда" + +msgid "Start a new merge request with these changes" +msgstr "" + +msgid "Switch branch/tag" +msgstr "Преминаване към клон/етикет" + +msgid "Tag" +msgid_plural "Tags" +msgstr[0] "Етикет" +msgstr[1] "Етикети" + +msgid "Tags" +msgstr "Етикети" + msgid "Target Branch" msgstr "Целеви клон" @@ -235,6 +759,9 @@ 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. " @@ -248,6 +775,12 @@ 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 " @@ -263,7 +796,18 @@ msgid "" "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 " @@ -305,6 +849,13 @@ msgstr "" "данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е " "(5+7)/2 = 6." +msgid "" +"This means you can not push code until you create an empty repository or " +"import existing one." +msgstr "" +"Това означава, че няма да можете да изпращате код, докато не създадете " +"празно хранилище или не внесете съществуващо такова." + msgid "Time before an issue gets scheduled" msgstr "Време преди един проблем да бъде планиран за работа" @@ -318,6 +869,129 @@ msgstr "" msgid "Time until first merge request" msgstr "Време преди първата заявка за сливане" +msgid "Timeago|%s days ago" +msgstr "преди %s дни" + +msgid "Timeago|%s days remaining" +msgstr "остават %s дни" + +msgid "Timeago|%s hours remaining" +msgstr "остават %s часа" + +msgid "Timeago|%s minutes ago" +msgstr "преди %s минути" + +msgid "Timeago|%s minutes remaining" +msgstr "остават %s минути" + +msgid "Timeago|%s months ago" +msgstr "преди %s месеца" + +msgid "Timeago|%s months remaining" +msgstr "остават %s месеца" + +msgid "Timeago|%s seconds remaining" +msgstr "остават %s секунди" + +msgid "Timeago|%s weeks ago" +msgstr "преди %s седмици" + +msgid "Timeago|%s weeks remaining" +msgstr "остават %s седмици" + +msgid "Timeago|%s years ago" +msgstr "преди %s години" + +msgid "Timeago|%s years remaining" +msgstr "остават %s години" + +msgid "Timeago|1 day remaining" +msgstr "остава 1 ден" + +msgid "Timeago|1 hour remaining" +msgstr "остава 1 час" + +msgid "Timeago|1 minute remaining" +msgstr "остава 1 минута" + +msgid "Timeago|1 month remaining" +msgstr "остава 1 месец" + +msgid "Timeago|1 week remaining" +msgstr "остава 1 седмица" + +msgid "Timeago|1 year remaining" +msgstr "остава 1 година" + +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 while" +msgstr "преди известно време" + +msgid "Timeago|a year ago" +msgstr "преди една година" + +msgid "Timeago|about %s hours ago" +msgstr "преди около %s часа" + +msgid "Timeago|about a minute ago" +msgstr "преди около една минута" + +msgid "Timeago|about an hour ago" +msgstr "преди около един час" + +msgid "Timeago|in %s days" +msgstr "след %s дни" + +msgid "Timeago|in %s hours" +msgstr "след %s часа" + +msgid "Timeago|in %s minutes" +msgstr "след %s минути" + +msgid "Timeago|in %s months" +msgstr "след %s месеца" + +msgid "Timeago|in %s seconds" +msgstr "след %s секунди" + +msgid "Timeago|in %s weeks" +msgstr "след %s седмици" + +msgid "Timeago|in %s years" +msgstr "след %s години" + +msgid "Timeago|in 1 day" +msgstr "след 1 ден" + +msgid "Timeago|in 1 hour" +msgstr "след 1 час" + +msgid "Timeago|in 1 minute" +msgstr "след 1 минута" + +msgid "Timeago|in 1 month" +msgstr "след 1 месец" + +msgid "Timeago|in 1 week" +msgstr "след 1 седмица" + +msgid "Timeago|in 1 year" +msgstr "след 1 година" + +msgid "Timeago|less than a minute ago" +msgstr "преди по-малко от минута" + msgid "Time|hr" msgid_plural "Time|hrs" msgstr[0] "час" @@ -337,17 +1011,119 @@ msgstr "Общо време" msgid "Total test time for all commits/merges" msgstr "Общо време за тестване на всички подавания/сливания" +msgid "Unstar" +msgstr "Без звезда" + +msgid "Upload New File" +msgstr "Качване на нов файл" + +msgid "Upload file" +msgstr "Качване на файл" + +msgid "Use your global notification setting" +msgstr "Използване на глобалната Ви настройка за известията" + +msgid "VisibilityLevel|Internal" +msgstr "Вътрешен" + +msgid "VisibilityLevel|Private" +msgstr "Частен" + +msgid "VisibilityLevel|Public" +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 "Withdraw Access Request" +msgstr "Оттегляне на заявката за достъп" + +msgid "" +"You are going to remove %{project_name_with_namespace}.\n" +"Removed project CANNOT be restored!\n" +"Are you ABSOLUTELY sure?" +msgstr "" +"На път сте да премахнете „%{project_name_with_namespace}“.\n" +"Ако го премахнете, той НЕ може да бъде възстановен!\n" +"НАИСТИНА ли искате това?" + +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 "" +"На път сте да прехвърлите „%{project_name_with_namespace}“ към друг " +"собственик. НАИСТИНА ли искате това?" + +msgid "You can only add files when you are on a branch" +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 "" +"Няма да можете да изтегляте или изпращате код в проекта чрез %{protocol}, " +"докато не %{set_password_link} за профила си" + +msgid "" +"You won't be able to pull or push project code via SSH until you " +"%{add_ssh_key_link} to your profile" +msgstr "" +"Няма да можете да изтегляте или изпращате код в проекта чрез SSH, докато не " +"%{add_ssh_key_link} в профила си" + +msgid "Your name" +msgstr "Вашето име" + msgid "day" msgid_plural "days" msgstr[0] "ден" msgstr[1] "дни" +msgid "notification emails" +msgstr "известия по е-поща" + +msgid "parent" +msgid_plural "parents" +msgstr[0] "" +msgstr[1] "" + +msgid "pipeline schedules documentation" +msgstr "" + +msgid "with stage" +msgid_plural "with stages" +msgstr[0] "" +msgstr[1] "" + From c065040835fb487cbf5c2a07eedfeb7b79cdbe16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Tue, 13 Jun 2017 17:32:34 +0800 Subject: [PATCH 0075/1380] Optimization 'bg' translation --- app/assets/javascripts/locale/bg/app.js | 2 +- locale/bg/gitlab.po | 86 +++++++++++++------------ locale/bg/gitlab.po.time_stamp | 1 - 3 files changed, 46 insertions(+), 43 deletions(-) diff --git a/app/assets/javascripts/locale/bg/app.js b/app/assets/javascripts/locale/bg/app.js index 33a5c3c7eb9..24888e33b2e 100644 --- a/app/assets/javascripts/locale/bg/app.js +++ b/app/assets/javascripts/locale/bg/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-12 09:36-0400","Last-Translator":"Lyubomir Vasilev ","Language-Team":"Bulgarian (https://translate.zanata.org/project/view/GitLab)","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"%{commit_author_link} committed %{commit_timeago}":[""],"About auto deploy":["Относно автоматичното внедряване"],"Active":[""],"Activity":["Дейност"],"Add Changelog":["Добавяне на списък с промени"],"Add Contribution guide":["Добавяне на ръководство за сътрудничество"],"Add License":["Добавяне на лиценз"],"Add an SSH key to your profile to pull or push via SSH.":["Добавете SSH ключ в профила си, за да можете да изтегляте или изпращате промени чрез SSH."],"Add new directory":["Добавяне на нова папка"],"Archived project! Repository is read-only":["Архивиран проект! Хранилището е само за четене"],"Are you sure you want to delete this pipeline schedule?":["Наистина ли искате да изтриете този план за схема?"],"Attach a file by drag & drop or %{upload_link}":[""],"Branch":["Клон","Клонове"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["Клонът %{branch_name} беше създаден. За да настроите автоматичното внедряване, изберете Yaml шаблон за GitLab CI и подайте промените си. %{link_to_autodeploy_doc}"],"Branches":["Клонове"],"Browse files":[""],"ByAuthor|by":["от"],"CI configuration":["Конфигурация на непрекъсната интеграция"],"Cancel":["Отказ"],"ChangeTypeActionLabel|Pick into branch":[""],"ChangeTypeActionLabel|Revert in branch":[""],"ChangeTypeAction|Cherry-pick":[""],"ChangeType|commit":[""],"ChangeType|merge request":[""],"Changelog":["Списък с промени"],"Charts":["Графики"],"Cherry-pick this commit":[""],"Cherry-pick this merge-request":[""],"CiStatusLabel|canceled":["отказано"],"CiStatusLabel|created":["създадено"],"CiStatusLabel|failed":["неуспешно"],"CiStatusLabel|manual action":["ръчно действие"],"CiStatusLabel|passed":["успешно"],"CiStatusLabel|passed with warnings":["успешно, с предупреждения"],"CiStatusLabel|pending":["на изчакване"],"CiStatusLabel|skipped":["пропуснато"],"CiStatusLabel|waiting for manual action":["чакане за ръчно действие"],"CiStatusText|blocked":["блокирано"],"CiStatusText|canceled":["отказано"],"CiStatusText|created":["създадено"],"CiStatusText|failed":["неуспешно"],"CiStatusText|manual":["ръчно"],"CiStatusText|passed":["успешно"],"CiStatusText|pending":["на изчакване"],"CiStatusText|skipped":["пропуснато"],"CiStatus|running":["протича в момента"],"Commit":["Подаване","Подавания"],"Commit message":[""],"CommitMessage|Add %{file_name}":["Добавяне на „%{file_name}“"],"Commits":["Подавания"],"Commits|History":["История"],"Committed by":[""],"Compare":["Сравнение"],"Contribution guide":["Ръководство за сътрудничество"],"Contributors":["Сътрудници"],"Copy URL to clipboard":["Копиране на адреса в буфера за обмен"],"Copy commit SHA to clipboard":["Копиране на идентификатора на подаването в буфера за обмен"],"Create New Directory":["Създаване на нова папка"],"Create directory":["Създаване на папка"],"Create empty bare repository":["Създаване на празно хранилище"],"Create merge request":["Създаване на заявка за сливане"],"Create new...":[""],"CreateNewFork|Fork":["Разклоняване"],"CreateTag|Tag":[""],"Cron Timezone":["Часова зона за „Cron“"],"Cron syntax":[""],"Custom":[""],"Custom notification events":["Персонализирани събития за известяване"],"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}.":["Персонализираните нива на известяване са същите като нивата за участие. С персонализираните нива на известяване ще можете да получавате и известия за избрани събития. За да научите повече, прегледайте %{notification_link}."],"Cycle Analytics":["Анализ на циклите"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Define a custom pattern with cron syntax":[""],"Delete":["Изтриване"],"Deploy":["Внедряване","Внедрявания"],"Description":["Описание"],"Directory name":["Име на папката"],"Don't show again":["Да не се показва повече"],"Download":["Сваляне"],"Download tar":["Сваляне във формат „tar“"],"Download tar.bz2":["Сваляне във формат „tar.bz2“"],"Download tar.gz":["Сваляне във формат „tar.gz“"],"Download zip":["Сваляне във формат „zip“"],"DownloadArtifacts|Download":["Сваляне"],"DownloadCommit|Email Patches":[""],"DownloadCommit|Plain Diff":[""],"DownloadSource|Download":["Сваляне"],"Edit":["Редактиране"],"Edit Pipeline Schedule %{id}":["Редактиране на плана %{id} за схема"],"Every day (at 4:00am)":[""],"Every month (on the 1st at 4:00am)":[""],"Every week (Sundays at 4:00am)":[""],"Failed to change the owner":["Собственикът не може да бъде променен"],"Failed to remove the pipeline schedule":["Планът за схема не може да бъде премахнат"],"Files":["Файлове"],"Find by path":["Търсене по път"],"Find file":["Търсене на файл"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"Fork":["Наследяване",""],"ForkedFromProjectPath|Forked from":["Разклонение на"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Go to your fork":["Към Вашето разклонение"],"GoToYourFork|Fork":["Разклонение"],"Home":["Начало"],"Housekeeping successfully started":["Освежаването започна успешно"],"Import repository":["Внасяне на хранилище"],"Interval Pattern":["Шаблон за интервала"],"Introducing Cycle Analytics":["Представяме Ви анализа на циклите"],"LFSStatus|Disabled":["Изключено"],"LFSStatus|Enabled":["Включено"],"Last %d day":["Последния %d ден","Последните %d дни"],"Last Pipeline":["Последна схема"],"Last Update":["Последна промяна"],"Last commit":["Последно подаване"],"Learn more in the":[""],"Leave group":["Напускане на групата"],"Leave project":["Напускане на проекта"],"Limited to showing %d event at most":["Ограничено до показване на най-много %d събитие","Ограничено до показване на най-много %d събития"],"Median":["Медиана"],"MissingSSHKeyWarningLink|add an SSH key":["добавите SSH ключ"],"New Issue":["Нов проблем","Нови проблема"],"New Pipeline Schedule":["Нов план за схема"],"New branch":["Нов клон"],"New directory":["Нова папка"],"New file":["Нов файл"],"New issue":["Нов проблем"],"New merge request":["Нова заявка за сливане"],"New schedule":[""],"New snippet":["Нов отрязък"],"New tag":["Нов етикет"],"No repository":["Няма хранилище"],"No schedules":["Няма планове"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"Notification events":["Събития за известяване"],"NotificationEvent|Close issue":["Затваряне на проблем"],"NotificationEvent|Close merge request":["Затваряне на заявка за сливане"],"NotificationEvent|Failed pipeline":["Неуспешно изпълнение на схема"],"NotificationEvent|Merge merge request":["Прилагане на заявка за сливане"],"NotificationEvent|New issue":["Нов проблем"],"NotificationEvent|New merge request":["Нова заявка за сливане"],"NotificationEvent|New note":["Нова бележка"],"NotificationEvent|Reassign issue":["Преназначаване на проблем"],"NotificationEvent|Reassign merge request":["Преназначаване на заявка за сливане"],"NotificationEvent|Reopen issue":["Повторно отваряне на проблем"],"NotificationEvent|Successful pipeline":["Успешно изпълнение на схема"],"NotificationLevel|Custom":["Персонализирани"],"NotificationLevel|Disabled":["Изключени"],"NotificationLevel|Global":["Глобални"],"NotificationLevel|On mention":["При споменаване"],"NotificationLevel|Participate":["Участие"],"NotificationLevel|Watch":["Наблюдение"],"OfSearchInADropdown|Filter":[""],"OpenedNDaysAgo|Opened":["Отворен"],"Options":[""],"Owner":["Собственик"],"Pipeline":[""],"Pipeline Health":["Състояние"],"Pipeline Schedule":["План за схема"],"Pipeline Schedules":["Планове за схема"],"PipelineSchedules|Activated":["Включено"],"PipelineSchedules|Active":["Активно"],"PipelineSchedules|All":["Всички"],"PipelineSchedules|Inactive":["Неактивно"],"PipelineSchedules|Next Run":["Следващо изпълнение"],"PipelineSchedules|None":["Нищо"],"PipelineSchedules|Provide a short description for this pipeline":["Въведете кратко описание за тази схема"],"PipelineSchedules|Take ownership":["Поемане на собствеността"],"PipelineSchedules|Target":["Цел"],"Project '%{project_name}' queued for deletion.":["Проектът „%{project_name}“ е добавен в опашката за изтриване."],"Project '%{project_name}' was successfully created.":["Проектът „%{project_name}“ беше създаден успешно."],"Project '%{project_name}' was successfully updated.":["Проектът „%{project_name}“ беше обновен успешно."],"Project '%{project_name}' will be deleted.":["Проектът „%{project_name}“ ще бъде изтрит."],"Project access must be granted explicitly to each user.":["Достъпът до проекта трябва да бъде даван поотделно на всеки потребител."],"Project export could not be deleted.":["Изнесените данни на проекта не могат да бъдат изтрити."],"Project export has been deleted.":["Изнесените данни на проекта бяха изтрити."],"Project export link has expired. Please generate a new export from your project settings.":["Връзката към изнесените данни на проекта изгуби давност. Моля, създайте нова от настройките на проекта."],"Project export started. A download link will be sent by email.":["Изнасянето на проекта започна. Ще получите връзка към данните по е-поща."],"Project home":["Начална страница на проекта"],"ProjectFeature|Disabled":["Изключено"],"ProjectFeature|Everyone with access":["Всеки с достъп"],"ProjectFeature|Only team members":["Само членовете на екипа"],"ProjectFileTree|Name":["Име"],"ProjectLastActivity|Never":["Никога"],"ProjectLifecycle|Stage":["Етап"],"ProjectNetworkGraph|Graph":["Графика"],"Read more":["Прочетете повече"],"Readme":["ПрочетиМе"],"RefSwitcher|Branches":["Клонове"],"RefSwitcher|Tags":["Етикети"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани внедрени задачи"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Remind later":["Напомняне по-късно"],"Remove project":["Премахване на проекта"],"Request Access":["Заявка за достъп"],"Revert this commit":[""],"Revert this merge-request":[""],"Save pipeline schedule":["Запазване на плана за схема"],"Schedule a new pipeline":["Създаване на нов план за схема"],"Scheduling Pipelines":[""],"Search branches and tags":["Търсене в клоновете и етикетите"],"Select Archive Format":["Изберете формата на архива"],"Select a timezone":["Изберете часова зона"],"Select target branch":["Изберете целеви клон"],"Set a password on your account to pull or push via %{protocol}":["Задайте парола на профила си, за да можете да изтегляте и изпращате промени чрез %{protocol}"],"Set up CI":["Настройка на НИ"],"Set up Koding":["Настройка на „Koding“"],"Set up auto deploy":["Настройка на авт. внедряване"],"SetPasswordToCloneLink|set a password":["зададете парола"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"Source code":["Изходен код"],"StarProject|Star":["Звезда"],"Start a new merge request with these changes":[""],"Switch branch/tag":["Преминаване към клон/етикет"],"Tag":["Етикет","Етикети"],"Tags":["Етикети"],"Target Branch":["Целеви клон"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"The fork relationship has been removed.":["Връзката на разклонение беше премахната."],"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.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"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.":[""],"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.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"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.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия. Данните ще бъдат добавени автоматично след като завършите един пълен цикъл и превърнете първата си идея в реалност."],"The project can be accessed by any logged in user.":["Всеки вписан потребител има достъп до проекта."],"The project can be accessed without any authentication.":["Всеки може да има достъп до проекта, без нужда от удостоверяване."],"The repository for this project does not exist.":["Хранилището за този проект не съществува."],"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.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"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.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"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.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнението на първата Ви схема."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"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.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"This means you can not push code until you create an empty repository or import existing one.":["Това означава, че няма да можете да изпращате код, докато не създадете празно хранилище или не внесете съществуващо такова."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Timeago|%s days ago":["преди %s дни"],"Timeago|%s days remaining":["остават %s дни"],"Timeago|%s hours remaining":["остават %s часа"],"Timeago|%s minutes ago":["преди %s минути"],"Timeago|%s minutes remaining":["остават %s минути"],"Timeago|%s months ago":["преди %s месеца"],"Timeago|%s months remaining":["остават %s месеца"],"Timeago|%s seconds remaining":["остават %s секунди"],"Timeago|%s weeks ago":["преди %s седмици"],"Timeago|%s weeks remaining":["остават %s седмици"],"Timeago|%s years ago":["преди %s години"],"Timeago|%s years remaining":["остават %s години"],"Timeago|1 day remaining":["остава 1 ден"],"Timeago|1 hour remaining":["остава 1 час"],"Timeago|1 minute remaining":["остава 1 минута"],"Timeago|1 month remaining":["остава 1 месец"],"Timeago|1 week remaining":["остава 1 седмица"],"Timeago|1 year remaining":["остава 1 година"],"Timeago|Past due":["Просрочено"],"Timeago|a day ago":["преди един ден"],"Timeago|a month ago":["преди един месец"],"Timeago|a week ago":["преди една седмица"],"Timeago|a while":["преди известно време"],"Timeago|a year ago":["преди една година"],"Timeago|about %s hours ago":["преди около %s часа"],"Timeago|about a minute ago":["преди около една минута"],"Timeago|about an hour ago":["преди около един час"],"Timeago|in %s days":["след %s дни"],"Timeago|in %s hours":["след %s часа"],"Timeago|in %s minutes":["след %s минути"],"Timeago|in %s months":["след %s месеца"],"Timeago|in %s seconds":["след %s секунди"],"Timeago|in %s weeks":["след %s седмици"],"Timeago|in %s years":["след %s години"],"Timeago|in 1 day":["след 1 ден"],"Timeago|in 1 hour":["след 1 час"],"Timeago|in 1 minute":["след 1 минута"],"Timeago|in 1 month":["след 1 месец"],"Timeago|in 1 week":["след 1 седмица"],"Timeago|in 1 year":["след 1 година"],"Timeago|less than a minute ago":["преди по-малко от минута"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Unstar":["Без звезда"],"Upload New File":["Качване на нов файл"],"Upload file":["Качване на файл"],"Use your global notification setting":["Използване на глобалната Ви настройка за известията"],"VisibilityLevel|Internal":["Вътрешен"],"VisibilityLevel|Private":["Частен"],"VisibilityLevel|Public":["Публичен"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"Withdraw Access Request":["Оттегляне на заявката за достъп"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["На път сте да премахнете „%{project_name_with_namespace}“.\\nАко го премахнете, той НЕ може да бъде възстановен!\\nНАИСТИНА ли искате това?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":[""],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["На път сте да прехвърлите „%{project_name_with_namespace}“ към друг собственик. НАИСТИНА ли искате това?"],"You can only add files when you are on a branch":["Можете да добавяте файлове само когато се намирате в клон"],"You must sign in to star a project":["Трябва да се впишете, за да отбележите проект със звезда"],"You need permission.":["Нуждаете се от разрешение."],"You will not get any notifications via email":["Няма да получавате никакви известия по е-поща"],"You will only receive notifications for the events you choose":["Ще получавате известия само за събитията, за които желаете"],"You will only receive notifications for threads you have participated in":["Ще получавате известия само за нещата, в които участвате"],"You will receive notifications for any activity":["Ще получавате известия за всяка дейност"],"You will receive notifications only for comments in which you were @mentioned":["Ще получавате известия само за коментари, в които Ви @споменават"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["Няма да можете да изтегляте или изпращате код в проекта чрез %{protocol}, докато не %{set_password_link} за профила си"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["Няма да можете да изтегляте или изпращате код в проекта чрез SSH, докато не %{add_ssh_key_link} в профила си"],"Your name":["Вашето име"],"day":["ден","дни"],"notification emails":["известия по е-поща"],"parent":["",""],"pipeline schedules documentation":[""],"with stage":["",""]}}}; \ No newline at end of file +var locales = locales || {}; locales['bg'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-13 04:23-0400","Last-Translator":"Lyubomir Vasilev ","Language-Team":"Bulgarian (https://translate.zanata.org/project/view/GitLab)","Language":"bg","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"bg","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"%{commit_author_link} committed %{commit_timeago}":["%{commit_author_link} подаде %{commit_timeago}"],"About auto deploy":["Относно автоматичното внедряване"],"Active":["Активно"],"Activity":["Дейност"],"Add Changelog":["Добавяне на списък с промени"],"Add Contribution guide":["Добавяне на ръководство за сътрудничество"],"Add License":["Добавяне на лиценз"],"Add an SSH key to your profile to pull or push via SSH.":["Добавете SSH ключ в профила си, за да можете да изтегляте или изпращате промени чрез SSH."],"Add new directory":["Добавяне на нова папка"],"Archived project! Repository is read-only":["Архивиран проект! Хранилището е само за четене"],"Are you sure you want to delete this pipeline schedule?":["Наистина ли искате да изтриете този план за схема?"],"Attach a file by drag & drop or %{upload_link}":["Прикачете файл чрез влачене и пускане или %{upload_link}"],"Branch":["Клон","Клонове"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["Клонът %{branch_name} беше създаден. За да настроите автоматичното внедряване, изберете Yaml шаблон за GitLab CI и подайте промените си. %{link_to_autodeploy_doc}"],"Branches":["Клонове"],"Browse files":["Разглеждане на файловете"],"ByAuthor|by":["от"],"CI configuration":["Конфигурация на непрекъсната интеграция"],"Cancel":["Отказ"],"ChangeTypeActionLabel|Pick into branch":["Избиране в клона"],"ChangeTypeActionLabel|Revert in branch":["Отмяна в клона"],"ChangeTypeAction|Cherry-pick":["Подбиране"],"ChangeType|commit":["подаване"],"ChangeType|merge request":["заявка за сливане"],"Changelog":["Списък с промени"],"Charts":["Графики"],"Cherry-pick this commit":["Подбиране на това подаване"],"Cherry-pick this merge-request":["Подбиране на тази заявка за сливане"],"CiStatusLabel|canceled":["отказано"],"CiStatusLabel|created":["създадено"],"CiStatusLabel|failed":["неуспешно"],"CiStatusLabel|manual action":["ръчно действие"],"CiStatusLabel|passed":["успешно"],"CiStatusLabel|passed with warnings":["успешно, с предупреждения"],"CiStatusLabel|pending":["на изчакване"],"CiStatusLabel|skipped":["пропуснато"],"CiStatusLabel|waiting for manual action":["чакане за ръчно действие"],"CiStatusText|blocked":["блокирано"],"CiStatusText|canceled":["отказано"],"CiStatusText|created":["създадено"],"CiStatusText|failed":["неуспешно"],"CiStatusText|manual":["ръчно"],"CiStatusText|passed":["успешно"],"CiStatusText|pending":["на изчакване"],"CiStatusText|skipped":["пропуснато"],"CiStatus|running":["протича в момента"],"Commit":["Подаване","Подавания"],"Commit message":["Съобщение за подаването"],"CommitMessage|Add %{file_name}":["Добавяне на „%{file_name}“"],"Commits":["Подавания"],"Commits|History":["История"],"Committed by":["Подадено от"],"Compare":["Сравнение"],"Contribution guide":["Ръководство за сътрудничество"],"Contributors":["Сътрудници"],"Copy URL to clipboard":["Копиране на адреса в буфера за обмен"],"Copy commit SHA to clipboard":["Копиране на идентификатора на подаването в буфера за обмен"],"Create New Directory":["Създаване на нова папка"],"Create directory":["Създаване на папка"],"Create empty bare repository":["Създаване на празно хранилище"],"Create merge request":["Създаване на заявка за сливане"],"Create new...":["Създаване на нов…"],"CreateNewFork|Fork":["Разклоняване"],"CreateTag|Tag":["Етикет"],"Cron Timezone":["Часова зона за „Cron“"],"Cron syntax":["Синтаксис на „Cron“"],"Custom":["Персонализиран"],"Custom notification events":["Персонализирани събития за известяване"],"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}.":["Персонализираните нива на известяване са същите като нивата за участие. С персонализираните нива на известяване ще можете да получавате и известия за избрани събития. За да научите повече, прегледайте %{notification_link}."],"Cycle Analytics":["Анализ на циклите"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["Анализът на циклите дава общ поглед върху това колко време е нужно на една идея да се превърне в завършена функционалност в проекта."],"CycleAnalyticsStage|Code":["Програмиране"],"CycleAnalyticsStage|Issue":["Проблем"],"CycleAnalyticsStage|Plan":["Планиране"],"CycleAnalyticsStage|Production":["Издаване"],"CycleAnalyticsStage|Review":["Преглед и одобрение"],"CycleAnalyticsStage|Staging":["Подготовка за издаване"],"CycleAnalyticsStage|Test":["Тестване"],"Define a custom pattern with cron syntax":["Задайте потребителски шаблон, използвайки синтаксиса на „Cron“"],"Delete":["Изтриване"],"Deploy":["Внедряване","Внедрявания"],"Description":["Описание"],"Directory name":["Име на папката"],"Don't show again":["Да не се показва повече"],"Download":["Сваляне"],"Download tar":["Сваляне във формат „tar“"],"Download tar.bz2":["Сваляне във формат „tar.bz2“"],"Download tar.gz":["Сваляне във формат „tar.gz“"],"Download zip":["Сваляне във формат „zip“"],"DownloadArtifacts|Download":["Сваляне"],"DownloadCommit|Email Patches":["Изпращане на кръпките по е-поща"],"DownloadCommit|Plain Diff":["Обикновен файл с разлики"],"DownloadSource|Download":["Сваляне"],"Edit":["Редактиране"],"Edit Pipeline Schedule %{id}":["Редактиране на плана %{id} за схема"],"Every day (at 4:00am)":["Всеки ден (в 4 ч. сутринта)"],"Every month (on the 1st at 4:00am)":["Всеки месец (на 1-во число, в 4 ч. сутринта)"],"Every week (Sundays at 4:00am)":["Всяка седмица (в неделя, в 4 ч. сутринта)"],"Failed to change the owner":["Собственикът не може да бъде променен"],"Failed to remove the pipeline schedule":["Планът за схема не може да бъде премахнат"],"Files":["Файлове"],"Find by path":["Търсене по път"],"Find file":["Търсене на файл"],"FirstPushedBy|First":["Първо"],"FirstPushedBy|pushed by":["изпращане на промени от"],"Fork":["Разклонение","Разклонения"],"ForkedFromProjectPath|Forked from":["Разклонение на"],"From issue creation until deploy to production":["От създаването на проблема до внедряването в крайната версия"],"From merge request merge until deploy to production":["От прилагането на заявката за сливане до внедряването в крайната версия"],"Go to your fork":["Към Вашето разклонение"],"GoToYourFork|Fork":["Разклонение"],"Home":["Начало"],"Housekeeping successfully started":["Освежаването започна успешно"],"Import repository":["Внасяне на хранилище"],"Interval Pattern":["Шаблон за интервала"],"Introducing Cycle Analytics":["Представяме Ви анализа на циклите"],"LFSStatus|Disabled":["Изключено"],"LFSStatus|Enabled":["Включено"],"Last %d day":["Последния %d ден","Последните %d дни"],"Last Pipeline":["Последна схема"],"Last Update":["Последна промяна"],"Last commit":["Последно подаване"],"Learn more in the":["Научете повече в"],"Leave group":["Напускане на групата"],"Leave project":["Напускане на проекта"],"Limited to showing %d event at most":["Ограничено до показване на най-много %d събитие","Ограничено до показване на най-много %d събития"],"Median":["Медиана"],"MissingSSHKeyWarningLink|add an SSH key":["добавите SSH ключ"],"New Issue":["Нов проблем","Нови проблема"],"New Pipeline Schedule":["Нов план за схема"],"New branch":["Нов клон"],"New directory":["Нова папка"],"New file":["Нов файл"],"New issue":["Нов проблем"],"New merge request":["Нова заявка за сливане"],"New schedule":["Нов план"],"New snippet":["Нов отрязък"],"New tag":["Нов етикет"],"No repository":["Няма хранилище"],"No schedules":["Няма планове"],"Not available":["Не е налично"],"Not enough data":["Няма достатъчно данни"],"Notification events":["Събития за известяване"],"NotificationEvent|Close issue":["Затваряне на проблем"],"NotificationEvent|Close merge request":["Затваряне на заявка за сливане"],"NotificationEvent|Failed pipeline":["Неуспешно изпълнение на схема"],"NotificationEvent|Merge merge request":["Прилагане на заявка за сливане"],"NotificationEvent|New issue":["Нов проблем"],"NotificationEvent|New merge request":["Нова заявка за сливане"],"NotificationEvent|New note":["Нова бележка"],"NotificationEvent|Reassign issue":["Преназначаване на проблем"],"NotificationEvent|Reassign merge request":["Преназначаване на заявка за сливане"],"NotificationEvent|Reopen issue":["Повторно отваряне на проблем"],"NotificationEvent|Successful pipeline":["Успешно изпълнение на схема"],"NotificationLevel|Custom":["Персонализирани"],"NotificationLevel|Disabled":["Изключени"],"NotificationLevel|Global":["Глобални"],"NotificationLevel|On mention":["При споменаване"],"NotificationLevel|Participate":["Участие"],"NotificationLevel|Watch":["Наблюдение"],"OfSearchInADropdown|Filter":["Филтър"],"OpenedNDaysAgo|Opened":["Отворен"],"Options":["Опции"],"Owner":["Собственик"],"Pipeline":["Схема"],"Pipeline Health":["Състояние"],"Pipeline Schedule":["План за схема"],"Pipeline Schedules":["Планове за схема"],"PipelineSchedules|Activated":["Включено"],"PipelineSchedules|Active":["Активно"],"PipelineSchedules|All":["Всички"],"PipelineSchedules|Inactive":["Неактивно"],"PipelineSchedules|Next Run":["Следващо изпълнение"],"PipelineSchedules|None":["Нищо"],"PipelineSchedules|Provide a short description for this pipeline":["Въведете кратко описание за тази схема"],"PipelineSchedules|Take ownership":["Поемане на собствеността"],"PipelineSchedules|Target":["Цел"],"Project '%{project_name}' queued for deletion.":["Проектът „%{project_name}“ е добавен в опашката за изтриване."],"Project '%{project_name}' was successfully created.":["Проектът „%{project_name}“ беше създаден успешно."],"Project '%{project_name}' was successfully updated.":["Проектът „%{project_name}“ беше обновен успешно."],"Project '%{project_name}' will be deleted.":["Проектът „%{project_name}“ ще бъде изтрит."],"Project access must be granted explicitly to each user.":["Достъпът до проекта трябва да бъде даван поотделно на всеки потребител."],"Project export could not be deleted.":["Изнесените данни на проекта не могат да бъдат изтрити."],"Project export has been deleted.":["Изнесените данни на проекта бяха изтрити."],"Project export link has expired. Please generate a new export from your project settings.":["Връзката към изнесените данни на проекта изгуби давност. Моля, създайте нова от настройките на проекта."],"Project export started. A download link will be sent by email.":["Изнасянето на проекта започна. Ще получите връзка към данните по е-поща."],"Project home":["Начална страница на проекта"],"ProjectFeature|Disabled":["Изключено"],"ProjectFeature|Everyone with access":["Всеки с достъп"],"ProjectFeature|Only team members":["Само членовете на екипа"],"ProjectFileTree|Name":["Име"],"ProjectLastActivity|Never":["Никога"],"ProjectLifecycle|Stage":["Етап"],"ProjectNetworkGraph|Graph":["Графика"],"Read more":["Прочетете повече"],"Readme":["ПрочетиМе"],"RefSwitcher|Branches":["Клонове"],"RefSwitcher|Tags":["Етикети"],"Related Commits":["Свързани подавания"],"Related Deployed Jobs":["Свързани внедрени задачи"],"Related Issues":["Свързани проблеми"],"Related Jobs":["Свързани задачи"],"Related Merge Requests":["Свързани заявки за сливане"],"Related Merged Requests":["Свързани приложени заявки за сливане"],"Remind later":["Напомняне по-късно"],"Remove project":["Премахване на проекта"],"Request Access":["Заявка за достъп"],"Revert this commit":["Отмяна на това подаване"],"Revert this merge-request":["Отмяна на тази заявка за сливане"],"Save pipeline schedule":["Запазване на плана за схема"],"Schedule a new pipeline":["Създаване на нов план за схема"],"Scheduling Pipelines":["Планиране на схемите"],"Search branches and tags":["Търсене в клоновете и етикетите"],"Select Archive Format":["Изберете формата на архива"],"Select a timezone":["Изберете часова зона"],"Select target branch":["Изберете целеви клон"],"Set a password on your account to pull or push via %{protocol}":["Задайте парола на профила си, за да можете да изтегляте и изпращате промени чрез %{protocol}"],"Set up CI":["Настройка на НИ"],"Set up Koding":["Настройка на „Koding“"],"Set up auto deploy":["Настройка на авт. внедряване"],"SetPasswordToCloneLink|set a password":["зададете парола"],"Showing %d event":["Показване на %d събитие","Показване на %d събития"],"Source code":["Изходен код"],"StarProject|Star":["Звезда"],"Start a new merge request with these changes":["Създайте нова заявка за сливане с тези промени"],"Switch branch/tag":["Преминаване към клон/етикет"],"Tag":["Етикет","Етикети"],"Tags":["Етикети"],"Target Branch":["Целеви клон"],"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.":["Етапът на програмиране показва времето от първото подаване до създаването на заявката за сливане. Данните ще бъдат добавени тук автоматично след като бъде създадена първата заявка за сливане."],"The collection of events added to the data gathered for that stage.":["Съвкупността от събития добавени към данните събрани за този етап."],"The fork relationship has been removed.":["Връзката на разклонение беше премахната."],"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.":["Етапът на проблемите показва колко е времето от създаването на проблем до определянето на целеви етап на проекта за него, или до добавянето му в списък на дъската за проблеми. Започнете да добавяте проблеми, за да видите данните за този етап."],"The phase of the development lifecycle.":["Етапът от цикъла на разработка"],"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.":["Този план за схема ще изпълнява схемите в бъдеще, периодично, за определени клонове или етикети. Тези планирани схеми ще наследят ограниченията на достъпа до проекта на свързания с тях потребител."],"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.":["Етапът на планиране показва колко е времето от преходната стъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично след като изпратите първото си подаване."],"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.":["Етапът на издаване показва общото време, което е нужно от създаването на проблем до внедряването на кода в крайната версия. Данните ще бъдат добавени автоматично след като завършите един пълен цикъл и превърнете първата си идея в реалност."],"The project can be accessed by any logged in user.":["Всеки вписан потребител има достъп до проекта."],"The project can be accessed without any authentication.":["Всеки може да има достъп до проекта, без нужда от удостоверяване."],"The repository for this project does not exist.":["Хранилището за този проект не съществува."],"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.":["Етапът на преглед и одобрение показва времето от създаването на заявката за сливане до прилагането ѝ. Данните ще бъдат добавени автоматично след като приложите първата си заявка за сливане."],"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.":["Етапът на подготовка за издаване показва времето между прилагането на заявката за сливане и внедряването на кода в средата на работещата крайна версия. Данните ще бъдат добавени автоматично след като направите първото си внедряване в крайната версия."],"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.":["Етапът на тестване показва времето, което е нужно на „Gitlab CI“ да изпълни всяка схема от задачи за свързаната заявка за сливане. Данните ще бъдат добавени автоматично след като приключи изпълнението на първата Ви схема."],"The time taken by each data entry gathered by that stage.":["Времето, което отнема всеки запис от данни за съответния етап."],"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.":["Стойността, която се намира в средата на последователността от наблюдавани данни. Например: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."],"This means you can not push code until you create an empty repository or import existing one.":["Това означава, че няма да можете да изпращате код, докато не създадете празно хранилище или не внесете съществуващо такова."],"Time before an issue gets scheduled":["Време преди един проблем да бъде планиран за работа"],"Time before an issue starts implementation":["Време преди работата по проблем да започне"],"Time between merge request creation and merge/close":["Време между създаване на заявка за сливане и прилагането/отхвърлянето ѝ"],"Time until first merge request":["Време преди първата заявка за сливане"],"Timeago|%s days ago":["преди %s дни"],"Timeago|%s days remaining":["остават %s дни"],"Timeago|%s hours remaining":["остават %s часа"],"Timeago|%s minutes ago":["преди %s минути"],"Timeago|%s minutes remaining":["остават %s минути"],"Timeago|%s months ago":["преди %s месеца"],"Timeago|%s months remaining":["остават %s месеца"],"Timeago|%s seconds remaining":["остават %s секунди"],"Timeago|%s weeks ago":["преди %s седмици"],"Timeago|%s weeks remaining":["остават %s седмици"],"Timeago|%s years ago":["преди %s години"],"Timeago|%s years remaining":["остават %s години"],"Timeago|1 day remaining":["остава 1 ден"],"Timeago|1 hour remaining":["остава 1 час"],"Timeago|1 minute remaining":["остава 1 минута"],"Timeago|1 month remaining":["остава 1 месец"],"Timeago|1 week remaining":["остава 1 седмица"],"Timeago|1 year remaining":["остава 1 година"],"Timeago|Past due":["Просрочено"],"Timeago|a day ago":["преди един ден"],"Timeago|a month ago":["преди един месец"],"Timeago|a week ago":["преди една седмица"],"Timeago|a while":["преди известно време"],"Timeago|a year ago":["преди една година"],"Timeago|about %s hours ago":["преди около %s часа"],"Timeago|about a minute ago":["преди около една минута"],"Timeago|about an hour ago":["преди около един час"],"Timeago|in %s days":["след %s дни"],"Timeago|in %s hours":["след %s часа"],"Timeago|in %s minutes":["след %s минути"],"Timeago|in %s months":["след %s месеца"],"Timeago|in %s seconds":["след %s секунди"],"Timeago|in %s weeks":["след %s седмици"],"Timeago|in %s years":["след %s години"],"Timeago|in 1 day":["след 1 ден"],"Timeago|in 1 hour":["след 1 час"],"Timeago|in 1 minute":["след 1 минута"],"Timeago|in 1 month":["след 1 месец"],"Timeago|in 1 week":["след 1 седмица"],"Timeago|in 1 year":["след 1 година"],"Timeago|less than a minute ago":["преди по-малко от минута"],"Time|hr":["час","часа"],"Time|min":["мин","мин"],"Time|s":["сек"],"Total Time":["Общо време"],"Total test time for all commits/merges":["Общо време за тестване на всички подавания/сливания"],"Unstar":["Без звезда"],"Upload New File":["Качване на нов файл"],"Upload file":["Качване на файл"],"Use your global notification setting":["Използване на глобалната Ви настройка за известията"],"VisibilityLevel|Internal":["Вътрешен"],"VisibilityLevel|Private":["Частен"],"VisibilityLevel|Public":["Публичен"],"Want to see the data? Please ask an administrator for access.":["Искате ли да видите данните? Помолете администратор за достъп."],"We don't have enough data to show this stage.":["Няма достатъчно данни за този етап."],"Withdraw Access Request":["Оттегляне на заявката за достъп"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["На път сте да премахнете „%{project_name_with_namespace}“.\\nАко го премахнете, той НЕ може да бъде възстановен!\\nНАИСТИНА ли искате това?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["На път сте да премахнете връзката на разклонението към оригиналния проект, „%{forked_from_project}“. НАИСТИНА ли искате това?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["На път сте да прехвърлите „%{project_name_with_namespace}“ към друг собственик. НАИСТИНА ли искате това?"],"You can only add files when you are on a branch":["Можете да добавяте файлове само когато се намирате в клон"],"You must sign in to star a project":["Трябва да се впишете, за да отбележите проект със звезда"],"You need permission.":["Нуждаете се от разрешение."],"You will not get any notifications via email":["Няма да получавате никакви известия по е-поща"],"You will only receive notifications for the events you choose":["Ще получавате известия само за събитията, за които желаете"],"You will only receive notifications for threads you have participated in":["Ще получавате известия само за нещата, в които участвате"],"You will receive notifications for any activity":["Ще получавате известия за всяка дейност"],"You will receive notifications only for comments in which you were @mentioned":["Ще получавате известия само за коментари, в които Ви @споменават"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["Няма да можете да изтегляте или изпращате код в проекта чрез %{protocol}, докато не %{set_password_link} за профила си"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["Няма да можете да изтегляте или изпращате код в проекта чрез SSH, докато не %{add_ssh_key_link} в профила си"],"Your name":["Вашето име"],"day":["ден","дни"],"notification emails":["известия по е-поща"],"parent":["родител","родители"],"pipeline schedules documentation":["документацията за планирането на схеми"],"with stage":["с етап","с етапи"]}}}; \ No newline at end of file diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po index fd00796d763..370aca1f1d9 100644 --- a/locale/bg/gitlab.po +++ b/locale/bg/gitlab.po @@ -7,7 +7,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-12 09:36-0400\n" +"PO-Revision-Date: 2017-06-13 04:23-0400\n" "Last-Translator: Lyubomir Vasilev \n" "Language-Team: Bulgarian (https://translate.zanata.org/project/view/GitLab)\n" "Language: bg\n" @@ -15,13 +15,13 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "%{commit_author_link} committed %{commit_timeago}" -msgstr "" +msgstr "%{commit_author_link} подаде %{commit_timeago}" msgid "About auto deploy" msgstr "Относно автоматичното внедряване" msgid "Active" -msgstr "" +msgstr "Активно" msgid "Activity" msgstr "Дейност" @@ -50,7 +50,7 @@ msgid "Are you sure you want to delete this pipeline schedule?" msgstr "Наистина ли искате да изтриете този план за схема?" msgid "Attach a file by drag & drop or %{upload_link}" -msgstr "" +msgstr "Прикачете файл чрез влачене и пускане или %{upload_link}" msgid "Branch" msgid_plural "Branches" @@ -70,7 +70,7 @@ msgid "Branches" msgstr "Клонове" msgid "Browse files" -msgstr "" +msgstr "Разглеждане на файловете" msgid "ByAuthor|by" msgstr "от" @@ -82,19 +82,19 @@ msgid "Cancel" msgstr "Отказ" msgid "ChangeTypeActionLabel|Pick into branch" -msgstr "" +msgstr "Избиране в клона" msgid "ChangeTypeActionLabel|Revert in branch" -msgstr "" +msgstr "Отмяна в клона" msgid "ChangeTypeAction|Cherry-pick" -msgstr "" +msgstr "Подбиране" msgid "ChangeType|commit" -msgstr "" +msgstr "подаване" msgid "ChangeType|merge request" -msgstr "" +msgstr "заявка за сливане" msgid "Changelog" msgstr "Списък с промени" @@ -103,10 +103,10 @@ msgid "Charts" msgstr "Графики" msgid "Cherry-pick this commit" -msgstr "" +msgstr "Подбиране на това подаване" msgid "Cherry-pick this merge-request" -msgstr "" +msgstr "Подбиране на тази заявка за сливане" msgid "CiStatusLabel|canceled" msgstr "отказано" @@ -168,7 +168,7 @@ msgstr[0] "Подаване" msgstr[1] "Подавания" msgid "Commit message" -msgstr "" +msgstr "Съобщение за подаването" msgid "CommitMessage|Add %{file_name}" msgstr "Добавяне на „%{file_name}“" @@ -180,7 +180,7 @@ msgid "Commits|History" msgstr "История" msgid "Committed by" -msgstr "" +msgstr "Подадено от" msgid "Compare" msgstr "Сравнение" @@ -210,22 +210,22 @@ msgid "Create merge request" msgstr "Създаване на заявка за сливане" msgid "Create new..." -msgstr "" +msgstr "Създаване на нов…" msgid "CreateNewFork|Fork" msgstr "Разклоняване" msgid "CreateTag|Tag" -msgstr "" +msgstr "Етикет" msgid "Cron Timezone" msgstr "Часова зона за „Cron“" msgid "Cron syntax" -msgstr "" +msgstr "Синтаксис на „Cron“" msgid "Custom" -msgstr "" +msgstr "Персонализиран" msgid "Custom notification events" msgstr "Персонализирани събития за известяване" @@ -271,7 +271,7 @@ msgid "CycleAnalyticsStage|Test" msgstr "Тестване" msgid "Define a custom pattern with cron syntax" -msgstr "" +msgstr "Задайте потребителски шаблон, използвайки синтаксиса на „Cron“" msgid "Delete" msgstr "Изтриване" @@ -309,10 +309,10 @@ msgid "DownloadArtifacts|Download" msgstr "Сваляне" msgid "DownloadCommit|Email Patches" -msgstr "" +msgstr "Изпращане на кръпките по е-поща" msgid "DownloadCommit|Plain Diff" -msgstr "" +msgstr "Обикновен файл с разлики" msgid "DownloadSource|Download" msgstr "Сваляне" @@ -324,13 +324,13 @@ msgid "Edit Pipeline Schedule %{id}" msgstr "Редактиране на плана %{id} за схема" msgid "Every day (at 4:00am)" -msgstr "" +msgstr "Всеки ден (в 4 ч. сутринта)" msgid "Every month (on the 1st at 4:00am)" -msgstr "" +msgstr "Всеки месец (на 1-во число, в 4 ч. сутринта)" msgid "Every week (Sundays at 4:00am)" -msgstr "" +msgstr "Всяка седмица (в неделя, в 4 ч. сутринта)" msgid "Failed to change the owner" msgstr "Собственикът не може да бъде променен" @@ -353,11 +353,10 @@ msgstr "Първо" msgid "FirstPushedBy|pushed by" msgstr "изпращане на промени от" -#, fuzzy msgid "Fork" msgid_plural "Forks" -msgstr[0] "Наследяване" -msgstr[1] "" +msgstr[0] "Разклонение" +msgstr[1] "Разклонения" msgid "ForkedFromProjectPath|Forked from" msgstr "Разклонение на" @@ -411,7 +410,7 @@ msgid "Last commit" msgstr "Последно подаване" msgid "Learn more in the" -msgstr "" +msgstr "Научете повече в" msgid "Leave group" msgstr "Напускане на групата" @@ -454,7 +453,7 @@ msgid "New merge request" msgstr "Нова заявка за сливане" msgid "New schedule" -msgstr "" +msgstr "Нов план" msgid "New snippet" msgstr "Нов отрязък" @@ -529,19 +528,19 @@ msgid "NotificationLevel|Watch" msgstr "Наблюдение" msgid "OfSearchInADropdown|Filter" -msgstr "" +msgstr "Филтър" msgid "OpenedNDaysAgo|Opened" msgstr "Отворен" msgid "Options" -msgstr "" +msgstr "Опции" msgid "Owner" msgstr "Собственик" msgid "Pipeline" -msgstr "" +msgstr "Схема" msgid "Pipeline Health" msgstr "Състояние" @@ -676,10 +675,10 @@ msgid "Request Access" msgstr "Заявка за достъп" msgid "Revert this commit" -msgstr "" +msgstr "Отмяна на това подаване" msgid "Revert this merge-request" -msgstr "" +msgstr "Отмяна на тази заявка за сливане" msgid "Save pipeline schedule" msgstr "Запазване на плана за схема" @@ -688,7 +687,7 @@ msgid "Schedule a new pipeline" msgstr "Създаване на нов план за схема" msgid "Scheduling Pipelines" -msgstr "" +msgstr "Планиране на схемите" msgid "Search branches and tags" msgstr "Търсене в клоновете и етикетите" @@ -731,7 +730,7 @@ msgid "StarProject|Star" msgstr "Звезда" msgid "Start a new merge request with these changes" -msgstr "" +msgstr "Създайте нова заявка за сливане с тези промени" msgid "Switch branch/tag" msgstr "Преминаване към клон/етикет" @@ -780,6 +779,9 @@ msgid "" "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 " @@ -1054,6 +1056,8 @@ msgid "" "You are going to remove the fork relationship to source project " "%{forked_from_project}. Are you ABSOLUTELY sure?" msgstr "" +"На път сте да премахнете връзката на разклонението към оригиналния проект, " +"„%{forked_from_project}“. НАИСТИНА ли искате това?" msgid "" "You are going to transfer %{project_name_with_namespace} to another owner. " @@ -1116,14 +1120,14 @@ msgstr "известия по е-поща" msgid "parent" msgid_plural "parents" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "родител" +msgstr[1] "родители" msgid "pipeline schedules documentation" -msgstr "" +msgstr "документацията за планирането на схеми" msgid "with stage" msgid_plural "with stages" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "с етап" +msgstr[1] "с етапи" diff --git a/locale/bg/gitlab.po.time_stamp b/locale/bg/gitlab.po.time_stamp index 0519ecba6ea..e69de29bb2d 100644 --- a/locale/bg/gitlab.po.time_stamp +++ b/locale/bg/gitlab.po.time_stamp @@ -1 +0,0 @@ - \ No newline at end of file From a5cb87a796abcaffa052ce90d96c16df4d5acb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Wed, 14 Jun 2017 11:41:45 +0800 Subject: [PATCH 0076/1380] supplement portuguese brazil translation Fix #33672 --- app/assets/javascripts/locale/pt_BR/app.js | 2 +- locale/pt_BR/gitlab.po | 1013 ++++++++++++++++++-- 2 files changed, 946 insertions(+), 69 deletions(-) diff --git a/app/assets/javascripts/locale/pt_BR/app.js b/app/assets/javascripts/locale/pt_BR/app.js index f2eed3da064..957b0c56333 100644 --- a/app/assets/javascripts/locale/pt_BR/app.js +++ b/app/assets/javascripts/locale/pt_BR/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['pt_BR'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-05-04 19:24-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-05 03:29-0400","Last-Translator":"Alexandre Alencar ","Language-Team":"Portuguese (Brazil)","Language":"pt-BR","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"pt_BR","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"ByAuthor|by":["por"],"Commit":["Commit","Commits"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["A Análise de Ciclo fornece uma visão geral de quanto tempo uma ideia demora para ir para produção em seu projeto."],"CycleAnalyticsStage|Code":["Código"],"CycleAnalyticsStage|Issue":["Tarefa"],"CycleAnalyticsStage|Plan":["Plano"],"CycleAnalyticsStage|Production":["Produção"],"CycleAnalyticsStage|Review":["Revisão"],"CycleAnalyticsStage|Staging":["Homologação"],"CycleAnalyticsStage|Test":["Teste"],"Deploy":["Implantação","Implantações"],"FirstPushedBy|First":["Primeiro"],"FirstPushedBy|pushed by":["publicado por"],"From issue creation until deploy to production":["Da criação de tarefas até a implantação para a produção"],"From merge request merge until deploy to production":["Da incorporação do merge request até a implantação em produção"],"Introducing Cycle Analytics":["Apresentando a Análise de Ciclo"],"Last %d day":["Último %d dia","Últimos %d dias"],"Limited to showing %d event at most":["Limitado a mostrar %d evento no máximo","Limitado a mostrar %d eventos no máximo"],"Median":["Mediana"],"New Issue":["Nova Tarefa","Novas Tarefas"],"Not available":["Não disponível"],"Not enough data":["Dados insuficientes"],"OpenedNDaysAgo|Opened":["Aberto"],"Pipeline Health":["Saúde da Pipeline"],"ProjectLifecycle|Stage":["Etapa"],"Read more":["Ler mais"],"Related Commits":["Commits Relacionados"],"Related Deployed Jobs":["Jobs Relacionados Incorporados"],"Related Issues":["Tarefas Relacionadas"],"Related Jobs":["Jobs Relacionados"],"Related Merge Requests":["Merge Requests Relacionados"],"Related Merged Requests":["Merge Requests Relacionados"],"Showing %d event":["Mostrando %d evento","Mostrando %d eventos"],"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.":["O estágio de codificação mostra o tempo desde o primeiro commit até a criação do merge request. \\nOs dados serão automaticamente adicionados aqui uma vez que você tenha criado seu primeiro merge request."],"The collection of events added to the data gathered for that stage.":["A coleção de eventos adicionados aos dados coletados para esse estágio."],"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.":["O estágio em questão mostra o tempo que leva desde a criação de uma tarefa até a sua assinatura para um milestone, ou a sua adição para a lista no seu Painel de Tarefas. Comece a criar tarefas para ver dados para esta etapa."],"The phase of the development lifecycle.":["A fase do ciclo de vida do desenvolvimento."],"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.":["A fase de planejamento mostra o tempo do passo anterior até empurrar o seu primeiro commit. Este tempo será adicionado automaticamente assim que você realizar seu primeiro commit."],"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.":["O estágio de produção mostra o tempo total que leva entre criar uma tarefa e implantar o código na produção. Os dados serão adicionados automaticamente até que você complete todo o ciclo de produção."],"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.":["A etapa de revisão mostra o tempo de criação de um merge request até que o merge seja feito. Os dados serão automaticamente adicionados depois que você fizer seu primeiro merge request."],"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.":["O estágio de estágio mostra o tempo entre a fusão do MR e o código de implantação para o ambiente de produção. Os dados serão automaticamente adicionados depois de implantar na produção pela primeira vez."],"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.":["A fase de teste mostra o tempo que o GitLab CI leva para executar cada pipeline para o merge request relacionado. Os dados serão automaticamente adicionados após a conclusão do primeiro pipeline."],"The time taken by each data entry gathered by that stage.":["O tempo necessário para cada entrada de dados reunida por essa etapa."],"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.":["O valor situado no ponto médio de uma série de valores observados. Ex., entre 3, 5, 9, a mediana é 5. Entre 3, 5, 7, 8, a mediana é (5 + 7) / 2 = 6."],"Time before an issue gets scheduled":["Tempo até que uma tarefa seja planejada"],"Time before an issue starts implementation":["Tempo até que uma tarefa comece a ser implementada"],"Time between merge request creation and merge/close":["Tempo entre a criação do merge request e o merge/fechamento"],"Time until first merge request":["Tempo até o primeiro merge request"],"Time|hr":["h","hs"],"Time|min":["min","mins"],"Time|s":["s"],"Total Time":["Tempo Total"],"Total test time for all commits/merges":["Tempo de teste total para todos os commits/merges"],"Want to see the data? Please ask an administrator for access.":["Precisa visualizar os dados? Solicite acesso ao administrador."],"We don't have enough data to show this stage.":["Não temos dados suficientes para mostrar esta fase."],"You need permission.":["Você precisa de permissão."],"day":["dia","dias"]}}}; \ No newline at end of file +var locales = locales || {}; locales['pt_BR'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-13 04:05-0400","Last-Translator":"Bruno Guimarães ","Language-Team":"Portuguese (Brazil) (https://translate.zanata.org/project/view/GitLab)","Language":"pt-BR","X-Generator":"Zanata 3.9.6","Plural-Forms":"nplurals=2; plural=(n != 1)","lang":"pt_BR","domain":"app","plural_forms":"nplurals=2; plural=(n != 1)"},"%{commit_author_link} committed %{commit_timeago}":["%{commit_author_link} fez commit %{commit_timeago}"],"About auto deploy":["Sobre a implantação automática"],"Active":["Ativo"],"Activity":["Atividade"],"Add Changelog":["Adicionar registro de mudanças"],"Add Contribution guide":["Adicionar Guia de contribuição"],"Add License":["Adicionar Licença"],"Add an SSH key to your profile to pull or push via SSH.":["Adicionar chave SSH ao seu perfil para fazer pull ou push via SSH."],"Add new directory":["Adicionar novo diretório"],"Archived project! Repository is read-only":["Projeto arquivado! O repositório é somente leitura"],"Are you sure you want to delete this pipeline schedule?":["Tem certeza que deseja excluir este agendamento de pipeline?"],"Attach a file by drag & drop or %{upload_link}":["Para anexar arquivo, arraste e solte ou %{upload_link}"],"Branch":["Branch","Branches"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["O branch %{branch_name} foi criado. Para configurar a auto implantação, selecione um modelo de Yaml do GitLab CI e registre suas mudanças. \\n%{link_to_autodeploy_doc}"],"Branches":["Branches"],"Browse files":["Navegar pelos arquivos"],"ByAuthor|by":["ByAuthor|por"],"CI configuration":["Configuração da Integração Contínua"],"Cancel":["Cancelar"],"ChangeTypeActionLabel|Pick into branch":["ChangeTypeActionLabel|Pick para um branch"],"ChangeTypeActionLabel|Revert in branch":["ChangeTypeActionLabel|Reverter no branch"],"ChangeTypeAction|Cherry-pick":["ChangeTypeAction|Cherry-pick"],"ChangeType|commit":["ChangeType|commit"],"ChangeType|merge request":["ChangeType|merge request"],"Changelog":["Registro de mudanças"],"Charts":["Gráficos"],"Cherry-pick this commit":["Cherry-pick esse commit"],"Cherry-pick this merge-request":["Cherry-pick esse merge-request"],"CiStatusLabel|canceled":["CiStatusLabel|cancelado"],"CiStatusLabel|created":["CiStatusLabel|criado"],"CiStatusLabel|failed":["CiStatusLabel|falhou"],"CiStatusLabel|manual action":["CiStatusLabel|ação manual"],"CiStatusLabel|passed":["CiStatusLabel|passou"],"CiStatusLabel|passed with warnings":["CiStatusLabel|passou com avisos"],"CiStatusLabel|pending":["CiStatusLabel|pendente"],"CiStatusLabel|skipped":["CiStatusLabel|ignorado"],"CiStatusLabel|waiting for manual action":["CiStatusLabel|aguardando ação manual"],"CiStatusText|blocked":["CiStatusText|bloqueado"],"CiStatusText|canceled":["CiStatusText|cancelado"],"CiStatusText|created":["CiStatusText|criado"],"CiStatusText|failed":["CiStatusText|falhou"],"CiStatusText|manual":["CiStatusText|manual"],"CiStatusText|passed":["CiStatusText|passou"],"CiStatusText|pending":["CiStatusText|pendente"],"CiStatusText|skipped":["CiStatusText|ignorado"],"CiStatus|running":["CiStatus|executando"],"Commit":["Conjunto de mudanças","Conjuntos de mudanças"],"Commit message":["Mensagem do conjunto de mudanças"],"CommitMessage|Add %{file_name}":["CommitMessage|Adicionar %{file_name}"],"Commits":["Conjuntos de mudanças"],"Commits|History":["Commits|Histórico"],"Committed by":["Entregue por"],"Compare":["Comparar"],"Contribution guide":["Guia de contribuição"],"Contributors":["Contribuidores"],"Copy URL to clipboard":["Copiar URL para área de transferência"],"Copy commit SHA to clipboard":["Copiar SHA do conjunto de mudanças para a área de transferência"],"Create New Directory":["Criar Novo Diretório"],"Create directory":["Criar diretório"],"Create empty bare repository":["Criar repositório centralizado vazio"],"Create merge request":["Criar solicitação de incorporação"],"Create new...":["Criar novo..."],"CreateNewFork|Fork":["CreateNewFork|Fork"],"CreateTag|Tag":["CreateTag|Tag"],"Cron Timezone":["Fuso horário do cron"],"Cron syntax":["Sintaxe do cron"],"Custom":["Personalizar"],"Custom notification events":["Eventos de notificação personalizados"],"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}.":["Níveis de notificação personalizados são equivalentes a níveis de participação. Com níveis de notificação personalizados você também será notificado sobre eventos selecionados. Para mais informações, visite %{notification_link}."],"Cycle Analytics":["Análise de Ciclo"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["A Análise de Ciclo fornece uma visão geral de quanto tempo uma ideia demora para ir para produção em seu projeto."],"CycleAnalyticsStage|Code":["CycleAnalyticsStage|Código"],"CycleAnalyticsStage|Issue":["CycleAnalyticsStage|Relato"],"CycleAnalyticsStage|Plan":["CycleAnalyticsStage|Plano"],"CycleAnalyticsStage|Production":["CycleAnalyticsStage|Produção"],"CycleAnalyticsStage|Review":["CycleAnalyticsStage|Revisão"],"CycleAnalyticsStage|Staging":["CycleAnalyticsStage|Homologação"],"CycleAnalyticsStage|Test":["CycleAnalyticsStage|Teste"],"Define a custom pattern with cron syntax":["Defina um padrão personalizado utilizando a sintaxe do cron"],"Delete":["Excluir"],"Deploy":["Implantação","Implantações"],"Description":["Descrição"],"Directory name":["Nome do diretório"],"Don't show again":["Não exibir novamente"],"Download":["Baixar"],"Download tar":["Baixar tar"],"Download tar.bz2":["Baixar tar.bz2"],"Download tar.gz":["Baixar tar.gz"],"Download zip":["Baixar zip"],"DownloadArtifacts|Download":["DownloadArtifacts|Baixar"],"DownloadCommit|Email Patches":["DownloadCommit|Email com as mudanças"],"DownloadCommit|Plain Diff":["DownloadCommit|Arquivo de texto com as mudanças"],"DownloadSource|Download":["DownloadSource|Baixar"],"Edit":["Alterar"],"Edit Pipeline Schedule %{id}":["Alterar Agendamento do Pipeline %{id}"],"Every day (at 4:00am)":["Todos os dias (às 4:00)"],"Every month (on the 1st at 4:00am)":["Todos os meses (no dia primeiro às 4:00)"],"Every week (Sundays at 4:00am)":["Toda semana (domingos às 4:00)"],"Failed to change the owner":["Erro ao alterar o proprietário"],"Failed to remove the pipeline schedule":["Erro ao excluir o agendamento do pipeline"],"Files":["Arquivos"],"Find by path":["Localizar por caminho"],"Find file":["Localizar arquivo"],"FirstPushedBy|First":["FirstPushedBy|Primeiro"],"FirstPushedBy|pushed by":["FirstPushedBy|publicado por"],"Fork":["Bifurcação","Bifurcações"],"ForkedFromProjectPath|Forked from":["ForkedFromProjectPath|Forked de"],"From issue creation until deploy to production":["Da abertura de tarefas até a implantação para a produção"],"From merge request merge until deploy to production":["Da aceitação da solicitação de incorporação até a implantação em produção"],"Go to your fork":["Ir para sua bifurcação"],"GoToYourFork|Fork":["GoToYourFork|Bifurcação"],"Home":["Início"],"Housekeeping successfully started":["Manutenção iniciada com sucesso"],"Import repository":["Importar repositório"],"Interval Pattern":["Padrão de intervalo"],"Introducing Cycle Analytics":["Apresentando a Análise de Ciclo"],"LFSStatus|Disabled":["LFSStatus|Desabilitado"],"LFSStatus|Enabled":["LFSStatus|Habilitado"],"Last %d day":["Último %d dia","Últimos %d dias"],"Last Pipeline":["Último Pipeline"],"Last Update":["Última Atualização"],"Last commit":["Último conjunto de mudanças"],"Learn more in the":["Saiba mais em"],"Leave group":["Sair do grupo"],"Leave project":["Sair do projeto"],"Limited to showing %d event at most":["Limitado a mostrar %d evento, no máximo","Limitado a mostrar %d eventos, no máximo"],"Median":["Mediana"],"MissingSSHKeyWarningLink|add an SSH key":["MissingSSHKeyWarningLink|adicione uma chave SSH"],"New Issue":["Novo Relato","Novos Relatos"],"New Pipeline Schedule":["Novo Agendamento de Pipeline"],"New branch":["Nova ramificação"],"New directory":["Novo diretório"],"New file":["Novo arquivo"],"New issue":["Novo relato"],"New merge request":["Nova solicitação de incorporação"],"New schedule":["Novo agendamento"],"New snippet":["Novo snippet"],"New tag":["Nova tag"],"No repository":["Nenhum repositório"],"No schedules":["Nenhum agendamento"],"Not available":["Não disponível"],"Not enough data":["Dados insuficientes"],"Notification events":["Eventos de notificação"],"NotificationEvent|Close issue":["NotificationEvent|Fechar relato"],"NotificationEvent|Close merge request":["NotificationEvent|Fechar solicitação de incorporação"],"NotificationEvent|Failed pipeline":["NotificationEvent|Falha no pipeline"],"NotificationEvent|Merge merge request":["NotificationEvent|Aceitar merge request"],"NotificationEvent|New issue":["NotificationEvent|Novo relato"],"NotificationEvent|New merge request":["NotificationEvent|Novo merge request"],"NotificationEvent|New note":["NotificationEvent|Novo comentário"],"NotificationEvent|Reassign issue":["NotificationEvent|Reatribuir relato"],"NotificationEvent|Reassign merge request":["NotificationEvent|Reatribuir merge request"],"NotificationEvent|Reopen issue":["NotificationEvent|Reabrir relato"],"NotificationEvent|Successful pipeline":["NotificationEvent|Pipeline bem sucedido"],"NotificationLevel|Custom":["NotificationLevel|Personalizar"],"NotificationLevel|Disabled":["NotificationLevel|Desabilitado"],"NotificationLevel|Global":["NotificationLevel|Global"],"NotificationLevel|On mention":["NotificationLevel|Quando mencionado"],"NotificationLevel|Participate":["NotificationLevel|Participar"],"NotificationLevel|Watch":["NotificationLevel|Observar"],"OfSearchInADropdown|Filter":["OfSearchInADropdown|Filtrar"],"OpenedNDaysAgo|Opened":["OpenedNDaysAgo|Aberto"],"Options":["Opções"],"Owner":["Proprietário"],"Pipeline":["Pipeline"],"Pipeline Health":["Saúde da Pipeline"],"Pipeline Schedule":["Agendamento da Pipeline"],"Pipeline Schedules":["Agendamentos da Pipeline"],"PipelineSchedules|Activated":["PipelineSchedules|Ativado"],"PipelineSchedules|Active":["PipelineSchedules|Ativo"],"PipelineSchedules|All":["PipelineSchedules|Todos"],"PipelineSchedules|Inactive":["PipelineSchedules|Inativo"],"PipelineSchedules|Next Run":["PipelineSchedules|Próxima Execução"],"PipelineSchedules|None":["PipelineSchedules|Nenhum"],"PipelineSchedules|Provide a short description for this pipeline":["PipelineSchedules|Digite uma descrição curta para esta pipeline"],"PipelineSchedules|Take ownership":["PipelineSchedules|Tornar-se proprietário"],"PipelineSchedules|Target":["PipelineSchedules|Destino"],"Project '%{project_name}' queued for deletion.":["Projeto'%{project_name}' marcado para exclusão."],"Project '%{project_name}' was successfully created.":["Projeto '%{project_name}' criado com sucesso."],"Project '%{project_name}' was successfully updated.":["Projeto '%{project_name}' atualizado com sucesso."],"Project '%{project_name}' will be deleted.":["Projeto '%{project_name}' será excluído."],"Project access must be granted explicitly to each user.":["Acesso ao projeto deve ser concedido explicitamente para cada usuário."],"Project export could not be deleted.":["A exportação do projeto não pôde ser excluída."],"Project export has been deleted.":["Exportação do projeto excluída."],"Project export link has expired. Please generate a new export from your project settings.":["O link para a exportação do projeto expirou. Favor gerar uma nova exportação a partir das configurações do projeto."],"Project export started. A download link will be sent by email.":["Exportação do projeto iniciada. Um link para baixá-la será enviado por email."],"Project home":["Página inicial do projeto"],"ProjectFeature|Disabled":["ProjectFeature|Desabilitado"],"ProjectFeature|Everyone with access":["ProjectFeature|Todos que possuem acesso"],"ProjectFeature|Only team members":["ProjectFeature|Apenas membros do time"],"ProjectFileTree|Name":["ProjectFileTree|Nome"],"ProjectLastActivity|Never":["ProjectLastActivity|Nunca"],"ProjectLifecycle|Stage":["PipelineSchedules|Etapa"],"ProjectNetworkGraph|Graph":["ProjectNetworkGraph|Árvore"],"Read more":["Leia mais"],"Readme":["Leia-me"],"RefSwitcher|Branches":["RefSwitcher|Ramificações"],"RefSwitcher|Tags":["RefSwitcher|Tags"],"Related Commits":["Conjuntos de Mudanças Relacionados"],"Related Deployed Jobs":["Tarefas Implantadas Relacionadas"],"Related Issues":["Relatos Relacionados"],"Related Jobs":["Tarefas Relacionadas"],"Related Merge Requests":["Solicitações de Incorporação Relacionadas"],"Related Merged Requests":["Solicitações de Incorporação Aceitas Relacionadas"],"Remind later":["Lembrar mais tarde"],"Remove project":["Remover projeto"],"Request Access":["Solicitar acesso"],"Revert this commit":["Reverter este conjunto de mudanças"],"Revert this merge-request":["Reverter esta solicitação de incorporação"],"Save pipeline schedule":["Salvar agendamento da pipeline"],"Schedule a new pipeline":["Agendar nova pipeline"],"Scheduling Pipelines":["Agendando pipelines"],"Search branches and tags":["Procurar ramificações e tags"],"Select Archive Format":["Selecionar Formato do Arquivo"],"Select a timezone":["Selecionar fuso horário"],"Select target branch":["Selecionar ramificação de destino"],"Set a password on your account to pull or push via %{protocol}":["Defina uma senha para sua conta para aceitar ou entregar código via %{protocol}"],"Set up CI":["Configurar CI"],"Set up Koding":["Configurar Koding"],"Set up auto deploy":["Configurar auto implantação"],"SetPasswordToCloneLink|set a password":["SetPasswordToCloneLink|defina uma senha"],"Showing %d event":["Mostrando %d evento","Mostrando %d eventos"],"Source code":["Código-fonte"],"StarProject|Star":["StarProject|Marcar"],"Start a new merge request with these changes":["Criar uma nova solicitação de incorporação com estas mudanças"],"Switch branch/tag":["Trocar ramificação/tag"],"Tag":["Tag","Tags"],"Tags":["Tags"],"Target Branch":["Ramificação de destino"],"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.":["A etapa de codificação mostra o tempo desde a entrega do primeiro conjunto de mudanças até a criação da solicitação de incorporação. Os dados serão automaticamente adicionados aqui desde o momento de criação da solicitação de incorporação."],"The collection of events added to the data gathered for that stage.":["A coleção de eventos adicionados aos dados coletados para essa etapa."],"The fork relationship has been removed.":["O relacionamento como fork foi removido."],"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.":["A etapa de relatos mostra o tempo que leva desde a criação de um relato até sua atribuição a um marco, ou sua adição a uma lista no seu Quadro de Relatos. Comece a criar relatos para ver dados para esta etapa."],"The phase of the development lifecycle.":["A fase do ciclo de vida do desenvolvimento."],"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.":["O agendamento de pipeline executa pipelines no futuro, repetidamente, para ramificações ou tags específicas. Essas pipelines agendadas terão acesso limitado ao projeto baseado no seu usuário associado."],"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.":["A etapa de planejamento mostra o tempo do passo anterior até a publicação de seu primeiro conjunto de mudanças. Este tempo será adicionado automaticamente assim que você enviar seu primeiro conjunto de mudanças."],"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.":["A etapa de produção mostra o tempo total que leva entre criar um relato e implantar o código em produção. Os dados serão adicionados automaticamente assim que você completar todo o ciclo de produção."],"The project can be accessed by any logged in user.":["O projeto pode ser acessado por qualquer usuário autenticado."],"The project can be accessed without any authentication.":["O projeto pode ser acessado sem a necessidade de autenticação."],"The repository for this project does not exist.":["O repositório para este projeto não existe."],"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.":["A etapa de revisão mostra o tempo de criação de uma solicitação de incorporação até sua aceitação. Os dados serão automaticamente adicionados depois que sua primeira solicitação de incorporação for aceita."],"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.":["A etapa de homologação mostra o tempo entre o aceite da solicitação de incorporação e a implantação do código no ambiente de produção. Os dados serão automaticamente adicionados depois que você implantar em produção pela primeira vez."],"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.":["A etapa de testes mostra o tempo que o GitLab CI leva para executar cada pipeline para a solicitação de incorporação associada. Os dados serão automaticamente adicionados após a conclusão do primeiro pipeline."],"The time taken by each data entry gathered by that stage.":["O tempo necessário por cada entrada de dados reunida por essa etapa."],"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.":["O valor situado no ponto médio de uma série de valores observados. Ex., entre 3, 5, 9, a mediana é 5. Entre 3, 5, 7, 8, a mediana é (5+7)/2 = 6."],"This means you can not push code until you create an empty repository or import existing one.":["Isto significa que você não pode entregar código até que crie um repositório vazio ou importe um existente."],"Time before an issue gets scheduled":["Tempo até que um relato seja agendado"],"Time before an issue starts implementation":["Tempo até que um relato comece a ser implementado"],"Time between merge request creation and merge/close":["Tempo entre a criação da solicitação de incorporação e a aceitação/fechamento"],"Time until first merge request":["Tempo até a primeira solicitação de incorporação"],"Timeago|%s days ago":["Timeago|há %s dias"],"Timeago|%s days remaining":["Timeago|%s dias restantes"],"Timeago|%s hours remaining":["Timeago|%s horas restantes"],"Timeago|%s minutes ago":["Timeago|há %s minutos"],"Timeago|%s minutes remaining":["Timeago|%s minutos restantes"],"Timeago|%s months ago":["Timeago|há %s meses"],"Timeago|%s months remaining":["Timeago|%s meses restantes"],"Timeago|%s seconds remaining":["Timeago|%s segundos restantes"],"Timeago|%s weeks ago":["Timeago|há %s semanas"],"Timeago|%s weeks remaining":["Timeago|%s semanas restantes"],"Timeago|%s years ago":["Timeago|há %s anos"],"Timeago|%s years remaining":["Timeago|%s anos restantes"],"Timeago|1 day remaining":["Timeago|1 dia restante"],"Timeago|1 hour remaining":["Timeago|1 hora restante"],"Timeago|1 minute remaining":["Timeago|1 minuto restante"],"Timeago|1 month remaining":["Timeago|1 mês restante"],"Timeago|1 week remaining":["Timeago|1 semana restante"],"Timeago|1 year remaining":["Timeago|1 ano restante"],"Timeago|Past due":["Timeago|Venceu"],"Timeago|a day ago":["Timeago|há um dia"],"Timeago|a month ago":["Timeago|há um mês"],"Timeago|a week ago":["Timeago|há uma semana"],"Timeago|a while":["Timeago|há algum tempo"],"Timeago|a year ago":["Timeago|há um ano"],"Timeago|about %s hours ago":["Timeago|há cerca de %s horas"],"Timeago|about a minute ago":["Timeago|há cerca de um minuto"],"Timeago|about an hour ago":["Timeago|há cerca de uma hora"],"Timeago|in %s days":["Timeago|em %s dias"],"Timeago|in %s hours":["Timeago|em %s horas"],"Timeago|in %s minutes":["Timeago|em %s minutos"],"Timeago|in %s months":["Timeago|em %s meses"],"Timeago|in %s seconds":["Timeago|em %s segundos"],"Timeago|in %s weeks":["Timeago|em %s semanas"],"Timeago|in %s years":["Timeago|em %s anos"],"Timeago|in 1 day":["Timeago|em 1 dia"],"Timeago|in 1 hour":["Timeago|em 1 hora"],"Timeago|in 1 minute":["Timeago|em 1 minuto"],"Timeago|in 1 month":["Timeago|em 1 mês"],"Timeago|in 1 week":["Timeago|em 1 semana"],"Timeago|in 1 year":["Timeago|em 1 ano"],"Timeago|less than a minute ago":["Timeago|há menos de um minuto"],"Time|hr":["Time|h","Time|hs"],"Time|min":["Time|min","Time|mins"],"Time|s":["Time|s"],"Total Time":["Tempo Total"],"Total test time for all commits/merges":["Tempo de teste total para todos os commits/merges"],"Unstar":["Desmarcar"],"Upload New File":["Enviar Novo Arquivo"],"Upload file":["Enviar arquivo"],"Use your global notification setting":["Utilizar configuração de notificação global"],"VisibilityLevel|Internal":["VisibilityLevel|Interno"],"VisibilityLevel|Private":["VisibilityLevel|Privado"],"VisibilityLevel|Public":["VisibilityLevel|Público"],"Want to see the data? Please ask an administrator for access.":["Precisa visualizar os dados? Solicite acesso ao administrador."],"We don't have enough data to show this stage.":["Esta etapa não possui dados suficientes para exibição."],"Withdraw Access Request":["Remover Requisição de Acesso"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["Você irá remover %{project_name_with_namespace}.\\nO projeto removido NÃO PODE ser restaurado!\\nTem certeza ABSOLUTA?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["Você ira remover o relacionamento de fork com o projeto original %{forked_from_project}. Tem certeza ABSOLUTA?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["Você irá transferir %{project_name_with_namespace} para outro proprietário. Tem certeza ABSOLUTA?"],"You can only add files when you are on a branch":["Você somente pode adicionar arquivos quando estiver em um branch"],"You must sign in to star a project":["Você deve estar autenticado para marcar um projeto"],"You need permission.":["Você precisa de permissão."],"You will not get any notifications via email":["Você não será notificado por email"],"You will only receive notifications for the events you choose":["Você será notificado apenas sobre eventos selecionados"],"You will only receive notifications for threads you have participated in":["Você será notificado apenas sobre tópicos nos quais participou"],"You will receive notifications for any activity":["Você será notificado sobre qualquer atividade"],"You will receive notifications only for comments in which you were @mentioned":["Você será notificado apenas sobre comentários que te @mencionam"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["Você não poderá fazer pull ou push via %{protocol} até que %{set_password_link} para sua conta"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["Você não conseguirá fazer pull ou push no projeto via SSH até que adicione %{add_ssh_key_link} ao seu perfil"],"Your name":["Seu nome"],"day":["dia","dias"],"notification emails":["emails de notificação"],"parent":["pai","pais"],"pipeline schedules documentation":["documentação do agendamento de pipelines"],"with stage":["com a etapa","com as etapas"]}}}; \ No newline at end of file diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po index 5ad41f92b64..a10da077fd2 100644 --- a/locale/pt_BR/gitlab.po +++ b/locale/pt_BR/gitlab.po @@ -1,28 +1,248 @@ # Alexandre Alencar , 2017. #zanata +# Bruno Guimarães , 2017. #zanata # Fabio Beneditto , 2017. #zanata -# Leandro Nunes dos Santos , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-05-04 19:24-0500\n" +"POT-Creation-Date: 2017-06-12 19:29-0500\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-05 03:29-0400\n" -"Last-Translator: Alexandre Alencar \n" -"Language-Team: Portuguese (Brazil)\n" +"PO-Revision-Date: 2017-06-13 04:05-0400\n" +"Last-Translator: Bruno Guimarães \n" +"Language-Team: Portuguese (Brazil) (https://translate.zanata.org/project/view/GitLab)\n" "Language: pt-BR\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" +msgid "%{commit_author_link} committed %{commit_timeago}" +msgstr "%{commit_author_link} fez commit %{commit_timeago}" + +msgid "About auto deploy" +msgstr "Sobre a implantação automática" + +msgid "Active" +msgstr "Ativo" + +msgid "Activity" +msgstr "Atividade" + +msgid "Add Changelog" +msgstr "Adicionar registro de mudanças" + +msgid "Add Contribution guide" +msgstr "Adicionar Guia de contribuição" + +msgid "Add License" +msgstr "Adicionar Licença" + +msgid "Add an SSH key to your profile to pull or push via SSH." +msgstr "Adicionar chave SSH ao seu perfil para fazer pull ou push via SSH." + +msgid "Add new directory" +msgstr "Adicionar novo diretório" + +msgid "Archived project! Repository is read-only" +msgstr "Projeto arquivado! O repositório é somente leitura" + +msgid "Are you sure you want to delete this pipeline schedule?" +msgstr "Tem certeza que deseja excluir este agendamento de pipeline?" + +msgid "Attach a file by drag & drop or %{upload_link}" +msgstr "Para anexar arquivo, arraste e solte ou %{upload_link}" + +msgid "Branch" +msgid_plural "Branches" +msgstr[0] "Branch" +msgstr[1] "Branches" + +msgid "" +"Branch %{branch_name} was created. To set up auto deploy, " +"choose a GitLab CI Yaml template and commit your changes. " +"%{link_to_autodeploy_doc}" +msgstr "" +"O branch %{branch_name} foi criado. Para configurar a auto " +"implantação, selecione um modelo de Yaml do GitLab CI e registre suas " +"mudanças. \n" +"%{link_to_autodeploy_doc}" + +msgid "Branches" +msgstr "Branches" + +msgid "Browse files" +msgstr "Navegar pelos arquivos" + msgid "ByAuthor|by" -msgstr "por" +msgstr "ByAuthor|por" + +msgid "CI configuration" +msgstr "Configuração da Integração Contínua" + +msgid "Cancel" +msgstr "Cancelar" + +msgid "ChangeTypeActionLabel|Pick into branch" +msgstr "ChangeTypeActionLabel|Pick para um branch" + +msgid "ChangeTypeActionLabel|Revert in branch" +msgstr "ChangeTypeActionLabel|Reverter no branch" + +msgid "ChangeTypeAction|Cherry-pick" +msgstr "ChangeTypeAction|Cherry-pick" + +msgid "ChangeType|commit" +msgstr "ChangeType|commit" + +msgid "ChangeType|merge request" +msgstr "ChangeType|merge request" + +msgid "Changelog" +msgstr "Registro de mudanças" + +msgid "Charts" +msgstr "Gráficos" + +msgid "Cherry-pick this commit" +msgstr "Cherry-pick esse commit" + +msgid "Cherry-pick this merge-request" +msgstr "Cherry-pick esse merge-request" + +msgid "CiStatusLabel|canceled" +msgstr "CiStatusLabel|cancelado" + +msgid "CiStatusLabel|created" +msgstr "CiStatusLabel|criado" + +msgid "CiStatusLabel|failed" +msgstr "CiStatusLabel|falhou" + +msgid "CiStatusLabel|manual action" +msgstr "CiStatusLabel|ação manual" + +msgid "CiStatusLabel|passed" +msgstr "CiStatusLabel|passou" + +msgid "CiStatusLabel|passed with warnings" +msgstr "CiStatusLabel|passou com avisos" + +msgid "CiStatusLabel|pending" +msgstr "CiStatusLabel|pendente" + +msgid "CiStatusLabel|skipped" +msgstr "CiStatusLabel|ignorado" + +msgid "CiStatusLabel|waiting for manual action" +msgstr "CiStatusLabel|aguardando ação manual" + +msgid "CiStatusText|blocked" +msgstr "CiStatusText|bloqueado" + +msgid "CiStatusText|canceled" +msgstr "CiStatusText|cancelado" + +msgid "CiStatusText|created" +msgstr "CiStatusText|criado" + +msgid "CiStatusText|failed" +msgstr "CiStatusText|falhou" + +msgid "CiStatusText|manual" +msgstr "CiStatusText|manual" + +msgid "CiStatusText|passed" +msgstr "CiStatusText|passou" + +msgid "CiStatusText|pending" +msgstr "CiStatusText|pendente" + +msgid "CiStatusText|skipped" +msgstr "CiStatusText|ignorado" + +msgid "CiStatus|running" +msgstr "CiStatus|executando" msgid "Commit" msgid_plural "Commits" -msgstr[0] "Commit" -msgstr[1] "Commits" +msgstr[0] "Conjunto de mudanças" +msgstr[1] "Conjuntos de mudanças" + +msgid "Commit message" +msgstr "Mensagem do conjunto de mudanças" + +msgid "CommitMessage|Add %{file_name}" +msgstr "CommitMessage|Adicionar %{file_name}" + +msgid "Commits" +msgstr "Conjuntos de mudanças" + +msgid "Commits|History" +msgstr "Commits|Histórico" + +msgid "Committed by" +msgstr "Entregue por" + +msgid "Compare" +msgstr "Comparar" + +msgid "Contribution guide" +msgstr "Guia de contribuição" + +msgid "Contributors" +msgstr "Contribuidores" + +msgid "Copy URL to clipboard" +msgstr "Copiar URL para área de transferência" + +msgid "Copy commit SHA to clipboard" +msgstr "Copiar SHA do conjunto de mudanças para a área de transferência" + +msgid "Create New Directory" +msgstr "Criar Novo Diretório" + +msgid "Create directory" +msgstr "Criar diretório" + +msgid "Create empty bare repository" +msgstr "Criar repositório centralizado vazio" + +msgid "Create merge request" +msgstr "Criar solicitação de incorporação" + +msgid "Create new..." +msgstr "Criar novo..." + +msgid "CreateNewFork|Fork" +msgstr "CreateNewFork|Fork" + +msgid "CreateTag|Tag" +msgstr "CreateTag|Tag" + +msgid "Cron Timezone" +msgstr "Fuso horário do cron" + +msgid "Cron syntax" +msgstr "Sintaxe do cron" + +msgid "Custom" +msgstr "Personalizar" + +msgid "Custom notification events" +msgstr "Eventos de notificação personalizados" + +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 "" +"Níveis de notificação personalizados são equivalentes a níveis de " +"participação. Com níveis de notificação personalizados você também será " +"notificado sobre eventos selecionados. Para mais informações, visite " +"%{notification_link}." + +msgid "Cycle Analytics" +msgstr "Análise de Ciclo" msgid "" "Cycle Analytics gives an overview of how much time it takes to go from idea " @@ -32,63 +252,222 @@ msgstr "" "para ir para produção em seu projeto." msgid "CycleAnalyticsStage|Code" -msgstr "Código" +msgstr "CycleAnalyticsStage|Código" msgid "CycleAnalyticsStage|Issue" -msgstr "Tarefa" +msgstr "CycleAnalyticsStage|Relato" msgid "CycleAnalyticsStage|Plan" -msgstr "Plano" +msgstr "CycleAnalyticsStage|Plano" msgid "CycleAnalyticsStage|Production" -msgstr "Produção" +msgstr "CycleAnalyticsStage|Produção" msgid "CycleAnalyticsStage|Review" -msgstr "Revisão" +msgstr "CycleAnalyticsStage|Revisão" msgid "CycleAnalyticsStage|Staging" -msgstr "Homologação" +msgstr "CycleAnalyticsStage|Homologação" msgid "CycleAnalyticsStage|Test" -msgstr "Teste" +msgstr "CycleAnalyticsStage|Teste" + +msgid "Define a custom pattern with cron syntax" +msgstr "Defina um padrão personalizado utilizando a sintaxe do cron" + +msgid "Delete" +msgstr "Excluir" msgid "Deploy" msgid_plural "Deploys" msgstr[0] "Implantação" msgstr[1] "Implantações" +msgid "Description" +msgstr "Descrição" + +msgid "Directory name" +msgstr "Nome do diretório" + +msgid "Don't show again" +msgstr "Não exibir novamente" + +msgid "Download" +msgstr "Baixar" + +msgid "Download tar" +msgstr "Baixar tar" + +msgid "Download tar.bz2" +msgstr "Baixar tar.bz2" + +msgid "Download tar.gz" +msgstr "Baixar tar.gz" + +msgid "Download zip" +msgstr "Baixar zip" + +msgid "DownloadArtifacts|Download" +msgstr "DownloadArtifacts|Baixar" + +msgid "DownloadCommit|Email Patches" +msgstr "DownloadCommit|Email com as mudanças" + +msgid "DownloadCommit|Plain Diff" +msgstr "DownloadCommit|Arquivo de texto com as mudanças" + +msgid "DownloadSource|Download" +msgstr "DownloadSource|Baixar" + +msgid "Edit" +msgstr "Alterar" + +msgid "Edit Pipeline Schedule %{id}" +msgstr "Alterar Agendamento do Pipeline %{id}" + +msgid "Every day (at 4:00am)" +msgstr "Todos os dias (às 4:00)" + +msgid "Every month (on the 1st at 4:00am)" +msgstr "Todos os meses (no dia primeiro às 4:00)" + +msgid "Every week (Sundays at 4:00am)" +msgstr "Toda semana (domingos às 4:00)" + +msgid "Failed to change the owner" +msgstr "Erro ao alterar o proprietário" + +msgid "Failed to remove the pipeline schedule" +msgstr "Erro ao excluir o agendamento do pipeline" + +msgid "Files" +msgstr "Arquivos" + +msgid "Find by path" +msgstr "Localizar por caminho" + +msgid "Find file" +msgstr "Localizar arquivo" + msgid "FirstPushedBy|First" -msgstr "Primeiro" +msgstr "FirstPushedBy|Primeiro" msgid "FirstPushedBy|pushed by" -msgstr "publicado por" +msgstr "FirstPushedBy|publicado por" + +msgid "Fork" +msgid_plural "Forks" +msgstr[0] "Bifurcação" +msgstr[1] "Bifurcações" + +msgid "ForkedFromProjectPath|Forked from" +msgstr "ForkedFromProjectPath|Forked de" msgid "From issue creation until deploy to production" -msgstr "Da criação de tarefas até a implantação para a produção" +msgstr "Da abertura de tarefas até a implantação para a produção" msgid "From merge request merge until deploy to production" -msgstr "Da incorporação do merge request até a implantação em produção" +msgstr "" +"Da aceitação da solicitação de incorporação até a implantação em produção" + +msgid "Go to your fork" +msgstr "Ir para sua bifurcação" + +msgid "GoToYourFork|Fork" +msgstr "GoToYourFork|Bifurcação" + +msgid "Home" +msgstr "Início" + +msgid "Housekeeping successfully started" +msgstr "Manutenção iniciada com sucesso" + +msgid "Import repository" +msgstr "Importar repositório" + +msgid "Interval Pattern" +msgstr "Padrão de intervalo" msgid "Introducing Cycle Analytics" msgstr "Apresentando a Análise de Ciclo" +msgid "LFSStatus|Disabled" +msgstr "LFSStatus|Desabilitado" + +msgid "LFSStatus|Enabled" +msgstr "LFSStatus|Habilitado" + msgid "Last %d day" msgid_plural "Last %d days" msgstr[0] "Último %d dia" msgstr[1] "Últimos %d dias" +msgid "Last Pipeline" +msgstr "Último Pipeline" + +msgid "Last Update" +msgstr "Última Atualização" + +msgid "Last commit" +msgstr "Último conjunto de mudanças" + +msgid "Learn more in the" +msgstr "Saiba mais em" + +msgid "Leave group" +msgstr "Sair do grupo" + +msgid "Leave project" +msgstr "Sair do projeto" + msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" -msgstr[0] "Limitado a mostrar %d evento no máximo" -msgstr[1] "Limitado a mostrar %d eventos no máximo" +msgstr[0] "Limitado a mostrar %d evento, no máximo" +msgstr[1] "Limitado a mostrar %d eventos, no máximo" msgid "Median" msgstr "Mediana" +msgid "MissingSSHKeyWarningLink|add an SSH key" +msgstr "MissingSSHKeyWarningLink|adicione uma chave SSH" + msgid "New Issue" msgid_plural "New Issues" -msgstr[0] "Nova Tarefa" -msgstr[1] "Novas Tarefas" +msgstr[0] "Novo Relato" +msgstr[1] "Novos Relatos" + +msgid "New Pipeline Schedule" +msgstr "Novo Agendamento de Pipeline" + +msgid "New branch" +msgstr "Nova ramificação" + +msgid "New directory" +msgstr "Novo diretório" + +msgid "New file" +msgstr "Novo arquivo" + +msgid "New issue" +msgstr "Novo relato" + +msgid "New merge request" +msgstr "Nova solicitação de incorporação" + +msgid "New schedule" +msgstr "Novo agendamento" + +msgid "New snippet" +msgstr "Novo snippet" + +msgid "New tag" +msgstr "Nova tag" + +msgid "No repository" +msgstr "Nenhum repositório" + +msgid "No schedules" +msgstr "Nenhum agendamento" msgid "Not available" msgstr "Não disponível" @@ -96,114 +475,376 @@ msgstr "Não disponível" msgid "Not enough data" msgstr "Dados insuficientes" +msgid "Notification events" +msgstr "Eventos de notificação" + +msgid "NotificationEvent|Close issue" +msgstr "NotificationEvent|Fechar relato" + +msgid "NotificationEvent|Close merge request" +msgstr "NotificationEvent|Fechar solicitação de incorporação" + +msgid "NotificationEvent|Failed pipeline" +msgstr "NotificationEvent|Falha no pipeline" + +msgid "NotificationEvent|Merge merge request" +msgstr "NotificationEvent|Aceitar merge request" + +msgid "NotificationEvent|New issue" +msgstr "NotificationEvent|Novo relato" + +msgid "NotificationEvent|New merge request" +msgstr "NotificationEvent|Novo merge request" + +msgid "NotificationEvent|New note" +msgstr "NotificationEvent|Novo comentário" + +msgid "NotificationEvent|Reassign issue" +msgstr "NotificationEvent|Reatribuir relato" + +msgid "NotificationEvent|Reassign merge request" +msgstr "NotificationEvent|Reatribuir merge request" + +msgid "NotificationEvent|Reopen issue" +msgstr "NotificationEvent|Reabrir relato" + +msgid "NotificationEvent|Successful pipeline" +msgstr "NotificationEvent|Pipeline bem sucedido" + +msgid "NotificationLevel|Custom" +msgstr "NotificationLevel|Personalizar" + +msgid "NotificationLevel|Disabled" +msgstr "NotificationLevel|Desabilitado" + +msgid "NotificationLevel|Global" +msgstr "NotificationLevel|Global" + +msgid "NotificationLevel|On mention" +msgstr "NotificationLevel|Quando mencionado" + +msgid "NotificationLevel|Participate" +msgstr "NotificationLevel|Participar" + +msgid "NotificationLevel|Watch" +msgstr "NotificationLevel|Observar" + +msgid "OfSearchInADropdown|Filter" +msgstr "OfSearchInADropdown|Filtrar" + msgid "OpenedNDaysAgo|Opened" -msgstr "Aberto" +msgstr "OpenedNDaysAgo|Aberto" + +msgid "Options" +msgstr "Opções" + +msgid "Owner" +msgstr "Proprietário" + +msgid "Pipeline" +msgstr "Pipeline" msgid "Pipeline Health" msgstr "Saúde da Pipeline" +msgid "Pipeline Schedule" +msgstr "Agendamento da Pipeline" + +msgid "Pipeline Schedules" +msgstr "Agendamentos da Pipeline" + +msgid "PipelineSchedules|Activated" +msgstr "PipelineSchedules|Ativado" + +msgid "PipelineSchedules|Active" +msgstr "PipelineSchedules|Ativo" + +msgid "PipelineSchedules|All" +msgstr "PipelineSchedules|Todos" + +msgid "PipelineSchedules|Inactive" +msgstr "PipelineSchedules|Inativo" + +msgid "PipelineSchedules|Next Run" +msgstr "PipelineSchedules|Próxima Execução" + +msgid "PipelineSchedules|None" +msgstr "PipelineSchedules|Nenhum" + +msgid "PipelineSchedules|Provide a short description for this pipeline" +msgstr "PipelineSchedules|Digite uma descrição curta para esta pipeline" + +msgid "PipelineSchedules|Take ownership" +msgstr "PipelineSchedules|Tornar-se proprietário" + +msgid "PipelineSchedules|Target" +msgstr "PipelineSchedules|Destino" + +msgid "Project '%{project_name}' queued for deletion." +msgstr "Projeto'%{project_name}' marcado para exclusão." + +msgid "Project '%{project_name}' was successfully created." +msgstr "Projeto '%{project_name}' criado com sucesso." + +msgid "Project '%{project_name}' was successfully updated." +msgstr "Projeto '%{project_name}' atualizado com sucesso." + +msgid "Project '%{project_name}' will be deleted." +msgstr "Projeto '%{project_name}' será excluído." + +msgid "Project access must be granted explicitly to each user." +msgstr "" +"Acesso ao projeto deve ser concedido explicitamente para cada usuário." + +msgid "Project export could not be deleted." +msgstr "A exportação do projeto não pôde ser excluída." + +msgid "Project export has been deleted." +msgstr "Exportação do projeto excluída." + +msgid "" +"Project export link has expired. Please generate a new export from your " +"project settings." +msgstr "" +"O link para a exportação do projeto expirou. Favor gerar uma nova exportação " +"a partir das configurações do projeto." + +msgid "Project export started. A download link will be sent by email." +msgstr "" +"Exportação do projeto iniciada. Um link para baixá-la será enviado por email." +"" + +msgid "Project home" +msgstr "Página inicial do projeto" + +msgid "ProjectFeature|Disabled" +msgstr "ProjectFeature|Desabilitado" + +msgid "ProjectFeature|Everyone with access" +msgstr "ProjectFeature|Todos que possuem acesso" + +msgid "ProjectFeature|Only team members" +msgstr "ProjectFeature|Apenas membros do time" + +msgid "ProjectFileTree|Name" +msgstr "ProjectFileTree|Nome" + +msgid "ProjectLastActivity|Never" +msgstr "ProjectLastActivity|Nunca" + msgid "ProjectLifecycle|Stage" -msgstr "Etapa" +msgstr "PipelineSchedules|Etapa" + +msgid "ProjectNetworkGraph|Graph" +msgstr "ProjectNetworkGraph|Árvore" msgid "Read more" -msgstr "Ler mais" +msgstr "Leia mais" + +msgid "Readme" +msgstr "Leia-me" + +msgid "RefSwitcher|Branches" +msgstr "RefSwitcher|Ramificações" + +msgid "RefSwitcher|Tags" +msgstr "RefSwitcher|Tags" msgid "Related Commits" -msgstr "Commits Relacionados" +msgstr "Conjuntos de Mudanças Relacionados" msgid "Related Deployed Jobs" -msgstr "Jobs Relacionados Incorporados" +msgstr "Tarefas Implantadas Relacionadas" msgid "Related Issues" -msgstr "Tarefas Relacionadas" +msgstr "Relatos Relacionados" msgid "Related Jobs" -msgstr "Jobs Relacionados" +msgstr "Tarefas Relacionadas" msgid "Related Merge Requests" -msgstr "Merge Requests Relacionados" +msgstr "Solicitações de Incorporação Relacionadas" msgid "Related Merged Requests" -msgstr "Merge Requests Relacionados" +msgstr "Solicitações de Incorporação Aceitas Relacionadas" + +msgid "Remind later" +msgstr "Lembrar mais tarde" + +msgid "Remove project" +msgstr "Remover projeto" + +msgid "Request Access" +msgstr "Solicitar acesso" + +msgid "Revert this commit" +msgstr "Reverter este conjunto de mudanças" + +msgid "Revert this merge-request" +msgstr "Reverter esta solicitação de incorporação" + +msgid "Save pipeline schedule" +msgstr "Salvar agendamento da pipeline" + +msgid "Schedule a new pipeline" +msgstr "Agendar nova pipeline" + +msgid "Scheduling Pipelines" +msgstr "Agendando pipelines" + +msgid "Search branches and tags" +msgstr "Procurar ramificações e tags" + +msgid "Select Archive Format" +msgstr "Selecionar Formato do Arquivo" + +msgid "Select a timezone" +msgstr "Selecionar fuso horário" + +msgid "Select target branch" +msgstr "Selecionar ramificação de destino" + +msgid "Set a password on your account to pull or push via %{protocol}" +msgstr "" +"Defina uma senha para sua conta para aceitar ou entregar código via " +"%{protocol}" + +msgid "Set up CI" +msgstr "Configurar CI" + +msgid "Set up Koding" +msgstr "Configurar Koding" + +msgid "Set up auto deploy" +msgstr "Configurar auto implantação" + +msgid "SetPasswordToCloneLink|set a password" +msgstr "SetPasswordToCloneLink|defina uma senha" msgid "Showing %d event" msgid_plural "Showing %d events" msgstr[0] "Mostrando %d evento" msgstr[1] "Mostrando %d eventos" +msgid "Source code" +msgstr "Código-fonte" + +msgid "StarProject|Star" +msgstr "StarProject|Marcar" + +msgid "Start a new merge request with these changes" +msgstr "" +"Criar uma nova solicitação de incorporação com estas " +"mudanças" + +msgid "Switch branch/tag" +msgstr "Trocar ramificação/tag" + +msgid "Tag" +msgid_plural "Tags" +msgstr[0] "Tag" +msgstr[1] "Tags" + +msgid "Tags" +msgstr "Tags" + +msgid "Target Branch" +msgstr "Ramificação de destino" + 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 "" -"O estágio de codificação mostra o tempo desde o primeiro commit até a " -"criação do merge request. \n" -"Os dados serão automaticamente adicionados aqui uma vez que você tenha " -"criado seu primeiro merge request." +"A etapa de codificação mostra o tempo desde a entrega do primeiro conjunto " +"de mudanças até a criação da solicitação de incorporação. Os dados serão " +"automaticamente adicionados aqui desde o momento de criação da solicitação " +"de incorporação." msgid "The collection of events added to the data gathered for that stage." -msgstr "" -"A coleção de eventos adicionados aos dados coletados para esse estágio." +msgstr "A coleção de eventos adicionados aos dados coletados para essa etapa." + +msgid "The fork relationship has been removed." +msgstr "O relacionamento como fork foi removido." 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 "" -"O estágio em questão mostra o tempo que leva desde a criação de uma tarefa " -"até a sua assinatura para um milestone, ou a sua adição para a lista no seu " -"Painel de Tarefas. Comece a criar tarefas para ver dados para esta etapa." +"A etapa de relatos mostra o tempo que leva desde a criação de um relato até " +"sua atribuição a um marco, ou sua adição a uma lista no seu Quadro de " +"Relatos. Comece a criar relatos para ver dados para esta etapa." msgid "The phase of the development lifecycle." msgstr "A fase do ciclo de vida do desenvolvimento." +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 "" +"O agendamento de pipeline executa pipelines no futuro, repetidamente, para " +"ramificações ou tags específicas. Essas pipelines agendadas terão acesso " +"limitado ao projeto baseado no seu usuário associado." + 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 "" -"A fase de planejamento mostra o tempo do passo anterior até empurrar o seu " -"primeiro commit. Este tempo será adicionado automaticamente assim que você " -"realizar seu primeiro commit." +"A etapa de planejamento mostra o tempo do passo anterior até a publicação de " +"seu primeiro conjunto de mudanças. Este tempo será adicionado " +"automaticamente assim que você enviar seu primeiro conjunto de mudanças." 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 "" -"O estágio de produção mostra o tempo total que leva entre criar uma tarefa e " -"implantar o código na produção. Os dados serão adicionados automaticamente " -"até que você complete todo o ciclo de produção." +"A etapa de produção mostra o tempo total que leva entre criar um relato e " +"implantar o código em produção. Os dados serão adicionados automaticamente " +"assim que você completar todo o ciclo de produção." + +msgid "The project can be accessed by any logged in user." +msgstr "O projeto pode ser acessado por qualquer usuário autenticado." + +msgid "The project can be accessed without any authentication." +msgstr "O projeto pode ser acessado sem a necessidade de autenticação." + +msgid "The repository for this project does not exist." +msgstr "O repositório para este projeto não existe." 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 "" -"A etapa de revisão mostra o tempo de criação de um merge request até que o " -"merge seja feito. Os dados serão automaticamente adicionados depois que você " -"fizer seu primeiro merge request." +"A etapa de revisão mostra o tempo de criação de uma solicitação de " +"incorporação até sua aceitação. Os dados serão automaticamente adicionados " +"depois que sua primeira solicitação de incorporação for aceita." 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 "" -"O estágio de estágio mostra o tempo entre a fusão do MR e o código de " -"implantação para o ambiente de produção. Os dados serão automaticamente " -"adicionados depois de implantar na produção pela primeira vez." +"A etapa de homologação mostra o tempo entre o aceite da solicitação de " +"incorporação e a implantação do código no ambiente de produção. Os dados " +"serão automaticamente adicionados depois que você implantar em produção pela " +"primeira vez." 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 "" -"A fase de teste mostra o tempo que o GitLab CI leva para executar cada " -"pipeline para o merge request relacionado. Os dados serão automaticamente " -"adicionados após a conclusão do primeiro pipeline." +"A etapa de testes mostra o tempo que o GitLab CI leva para executar cada " +"pipeline para a solicitação de incorporação associada. Os dados serão " +"automaticamente adicionados após a conclusão do primeiro pipeline." msgid "The time taken by each data entry gathered by that stage." -msgstr "O tempo necessário para cada entrada de dados reunida por essa etapa." +msgstr "O tempo necessário por cada entrada de dados reunida por essa etapa." msgid "" "The value lying at the midpoint of a series of observed values. E.g., " @@ -211,32 +852,164 @@ msgid "" " 6." msgstr "" "O valor situado no ponto médio de uma série de valores observados. Ex., " -"entre 3, 5, 9, a mediana é 5. Entre 3, 5, 7, 8, a mediana é (5 + 7) / 2 = 6." +"entre 3, 5, 9, a mediana é 5. Entre 3, 5, 7, 8, a mediana é (5+7)/2 = 6." + +msgid "" +"This means you can not push code until you create an empty repository or " +"import existing one." +msgstr "" +"Isto significa que você não pode entregar código até que crie um repositório " +"vazio ou importe um existente." msgid "Time before an issue gets scheduled" -msgstr "Tempo até que uma tarefa seja planejada" +msgstr "Tempo até que um relato seja agendado" msgid "Time before an issue starts implementation" -msgstr "Tempo até que uma tarefa comece a ser implementada" +msgstr "Tempo até que um relato comece a ser implementado" msgid "Time between merge request creation and merge/close" -msgstr "Tempo entre a criação do merge request e o merge/fechamento" +msgstr "" +"Tempo entre a criação da solicitação de incorporação e a aceitação/" +"fechamento" msgid "Time until first merge request" -msgstr "Tempo até o primeiro merge request" +msgstr "Tempo até a primeira solicitação de incorporação" + +msgid "Timeago|%s days ago" +msgstr "Timeago|há %s dias" + +msgid "Timeago|%s days remaining" +msgstr "Timeago|%s dias restantes" + +msgid "Timeago|%s hours remaining" +msgstr "Timeago|%s horas restantes" + +msgid "Timeago|%s minutes ago" +msgstr "Timeago|há %s minutos" + +msgid "Timeago|%s minutes remaining" +msgstr "Timeago|%s minutos restantes" + +msgid "Timeago|%s months ago" +msgstr "Timeago|há %s meses" + +msgid "Timeago|%s months remaining" +msgstr "Timeago|%s meses restantes" + +msgid "Timeago|%s seconds remaining" +msgstr "Timeago|%s segundos restantes" + +msgid "Timeago|%s weeks ago" +msgstr "Timeago|há %s semanas" + +msgid "Timeago|%s weeks remaining" +msgstr "Timeago|%s semanas restantes" + +msgid "Timeago|%s years ago" +msgstr "Timeago|há %s anos" + +msgid "Timeago|%s years remaining" +msgstr "Timeago|%s anos restantes" + +msgid "Timeago|1 day remaining" +msgstr "Timeago|1 dia restante" + +msgid "Timeago|1 hour remaining" +msgstr "Timeago|1 hora restante" + +msgid "Timeago|1 minute remaining" +msgstr "Timeago|1 minuto restante" + +msgid "Timeago|1 month remaining" +msgstr "Timeago|1 mês restante" + +msgid "Timeago|1 week remaining" +msgstr "Timeago|1 semana restante" + +msgid "Timeago|1 year remaining" +msgstr "Timeago|1 ano restante" + +msgid "Timeago|Past due" +msgstr "Timeago|Venceu" + +msgid "Timeago|a day ago" +msgstr "Timeago|há um dia" + +msgid "Timeago|a month ago" +msgstr "Timeago|há um mês" + +msgid "Timeago|a week ago" +msgstr "Timeago|há uma semana" + +msgid "Timeago|a while" +msgstr "Timeago|há algum tempo" + +msgid "Timeago|a year ago" +msgstr "Timeago|há um ano" + +msgid "Timeago|about %s hours ago" +msgstr "Timeago|há cerca de %s horas" + +msgid "Timeago|about a minute ago" +msgstr "Timeago|há cerca de um minuto" + +msgid "Timeago|about an hour ago" +msgstr "Timeago|há cerca de uma hora" + +msgid "Timeago|in %s days" +msgstr "Timeago|em %s dias" + +msgid "Timeago|in %s hours" +msgstr "Timeago|em %s horas" + +msgid "Timeago|in %s minutes" +msgstr "Timeago|em %s minutos" + +msgid "Timeago|in %s months" +msgstr "Timeago|em %s meses" + +msgid "Timeago|in %s seconds" +msgstr "Timeago|em %s segundos" + +msgid "Timeago|in %s weeks" +msgstr "Timeago|em %s semanas" + +msgid "Timeago|in %s years" +msgstr "Timeago|em %s anos" + +msgid "Timeago|in 1 day" +msgstr "Timeago|em 1 dia" + +msgid "Timeago|in 1 hour" +msgstr "Timeago|em 1 hora" + +msgid "Timeago|in 1 minute" +msgstr "Timeago|em 1 minuto" + +msgid "Timeago|in 1 month" +msgstr "Timeago|em 1 mês" + +msgid "Timeago|in 1 week" +msgstr "Timeago|em 1 semana" + +msgid "Timeago|in 1 year" +msgstr "Timeago|em 1 ano" + +msgid "Timeago|less than a minute ago" +msgstr "Timeago|há menos de um minuto" msgid "Time|hr" msgid_plural "Time|hrs" -msgstr[0] "h" -msgstr[1] "hs" +msgstr[0] "Time|h" +msgstr[1] "Time|hs" msgid "Time|min" msgid_plural "Time|mins" -msgstr[0] "min" -msgstr[1] "mins" +msgstr[0] "Time|min" +msgstr[1] "Time|mins" msgid "Time|s" -msgstr "s" +msgstr "Time|s" msgid "Total Time" msgstr "Tempo Total" @@ -244,17 +1017,121 @@ msgstr "Tempo Total" msgid "Total test time for all commits/merges" msgstr "Tempo de teste total para todos os commits/merges" +msgid "Unstar" +msgstr "Desmarcar" + +msgid "Upload New File" +msgstr "Enviar Novo Arquivo" + +msgid "Upload file" +msgstr "Enviar arquivo" + +msgid "Use your global notification setting" +msgstr "Utilizar configuração de notificação global" + +msgid "VisibilityLevel|Internal" +msgstr "VisibilityLevel|Interno" + +msgid "VisibilityLevel|Private" +msgstr "VisibilityLevel|Privado" + +msgid "VisibilityLevel|Public" +msgstr "VisibilityLevel|Público" + msgid "Want to see the data? Please ask an administrator for access." msgstr "Precisa visualizar os dados? Solicite acesso ao administrador." msgid "We don't have enough data to show this stage." -msgstr "Não temos dados suficientes para mostrar esta fase." +msgstr "Esta etapa não possui dados suficientes para exibição." + +msgid "Withdraw Access Request" +msgstr "Remover Requisição de Acesso" + +msgid "" +"You are going to remove %{project_name_with_namespace}.\n" +"Removed project CANNOT be restored!\n" +"Are you ABSOLUTELY sure?" +msgstr "" +"Você irá remover %{project_name_with_namespace}.\n" +"O projeto removido NÃO PODE ser restaurado!\n" +"Tem certeza ABSOLUTA?" + +msgid "" +"You are going to remove the fork relationship to source project " +"%{forked_from_project}. Are you ABSOLUTELY sure?" +msgstr "" +"Você ira remover o relacionamento de fork com o projeto original " +"%{forked_from_project}. Tem certeza ABSOLUTA?" + +msgid "" +"You are going to transfer %{project_name_with_namespace} to another owner. " +"Are you ABSOLUTELY sure?" +msgstr "" +"Você irá transferir %{project_name_with_namespace} para outro proprietário. " +"Tem certeza ABSOLUTA?" + +msgid "You can only add files when you are on a branch" +msgstr "Você somente pode adicionar arquivos quando estiver em um branch" + +msgid "You must sign in to star a project" +msgstr "Você deve estar autenticado para marcar um projeto" msgid "You need permission." msgstr "Você precisa de permissão." +msgid "You will not get any notifications via email" +msgstr "Você não será notificado por email" + +msgid "You will only receive notifications for the events you choose" +msgstr "Você será notificado apenas sobre eventos selecionados" + +msgid "" +"You will only receive notifications for threads you have participated in" +msgstr "Você será notificado apenas sobre tópicos nos quais participou" + +msgid "You will receive notifications for any activity" +msgstr "Você será notificado sobre qualquer atividade" + +msgid "" +"You will receive notifications only for comments in which you were " +"@mentioned" +msgstr "Você será notificado apenas sobre comentários que te @mencionam" + +msgid "" +"You won't be able to pull or push project code via %{protocol} until you " +"%{set_password_link} on your account" +msgstr "" +"Você não poderá fazer pull ou push via %{protocol} até que " +"%{set_password_link} para sua conta" + +msgid "" +"You won't be able to pull or push project code via SSH until you " +"%{add_ssh_key_link} to your profile" +msgstr "" +"Você não conseguirá fazer pull ou push no projeto via SSH até que adicione " +"%{add_ssh_key_link} ao seu perfil" + +msgid "Your name" +msgstr "Seu nome" + msgid "day" msgid_plural "days" msgstr[0] "dia" msgstr[1] "dias" +msgid "notification emails" +msgstr "emails de notificação" + +msgid "parent" +msgid_plural "parents" +msgstr[0] "pai" +msgstr[1] "pais" + +msgid "pipeline schedules documentation" +msgstr "documentação do agendamento de pipelines" + +msgid "with stage" +msgid_plural "with stages" +msgstr[0] "com a etapa" +msgstr[1] "com as etapas" + From 7cbdaef37c0d09c92df6ac45dfaf4fbf879d16c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Wed, 14 Jun 2017 13:06:17 +0800 Subject: [PATCH 0077/1380] add changelog of supplement portuguese brazil translation --- ...33672-supplement_portuguese_brazil_translation_of_i18n.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/33672-supplement_portuguese_brazil_translation_of_i18n.yml diff --git a/changelogs/unreleased/33672-supplement_portuguese_brazil_translation_of_i18n.yml b/changelogs/unreleased/33672-supplement_portuguese_brazil_translation_of_i18n.yml new file mode 100644 index 00000000000..605c360115e --- /dev/null +++ b/changelogs/unreleased/33672-supplement_portuguese_brazil_translation_of_i18n.yml @@ -0,0 +1,4 @@ +--- +title: Supplement Portuguese Brazil translation of Project Page & Repository Page +merge_request: 11958 +author: Huang Tao From 903eeccd74be552001bb2cd21bc2c5f1eb26f94b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Wed, 14 Jun 2017 13:08:51 +0800 Subject: [PATCH 0078/1380] revise changelog --- .../33672-supplement_portuguese_brazil_translation_of_i18n.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/unreleased/33672-supplement_portuguese_brazil_translation_of_i18n.yml b/changelogs/unreleased/33672-supplement_portuguese_brazil_translation_of_i18n.yml index 605c360115e..d2bdc631d2a 100644 --- a/changelogs/unreleased/33672-supplement_portuguese_brazil_translation_of_i18n.yml +++ b/changelogs/unreleased/33672-supplement_portuguese_brazil_translation_of_i18n.yml @@ -1,4 +1,4 @@ --- title: Supplement Portuguese Brazil translation of Project Page & Repository Page -merge_request: 11958 +merge_request: 12156 author: Huang Tao From 01485316f5e0fd10730e1a6bbeb71ff5f2d45d85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Wed, 14 Jun 2017 17:52:00 +0800 Subject: [PATCH 0079/1380] translation optimization in synchronous reviews --- app/assets/javascripts/locale/zh_HK/app.js | 2 +- locale/zh_HK/gitlab.po | 124 ++++++++++----------- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/app/assets/javascripts/locale/zh_HK/app.js b/app/assets/javascripts/locale/zh_HK/app.js index 67054b3ef4a..b43910dc641 100644 --- a/app/assets/javascripts/locale/zh_HK/app.js +++ b/app/assets/javascripts/locale/zh_HK/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-13 04:07-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"%{commit_author_link} committed %{commit_timeago}":["由 %{commit_author_link} 提交於 %{commit_timeago}"],"About auto deploy":["關於自動部署"],"Active":["激活"],"Activity":["活動"],"Add Changelog":["添加變更日誌"],"Add Contribution guide":["添加貢獻指南"],"Add License":["添加許可證"],"Add an SSH key to your profile to pull or push via SSH.":["新增壹個用於推送或拉取的 SSH 秘鑰到賬號中。"],"Add new directory":["添加新目錄"],"Archived project! Repository is read-only":["歸檔項目!存儲庫為只讀"],"Are you sure you want to delete this pipeline schedule?":["您確定要刪除此流水線計劃嗎?"],"Attach a file by drag & drop or %{upload_link}":["拖放文件到此處或者 %{upload_link}"],"Branch":["分支"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["分支 %{branch_name} 已創建。如要設置自動部署, 請選擇合適的 GitLab CI Yaml 模板併提交更改。%{link_to_autodeploy_doc}"],"Branches":["分支"],"Browse files":["瀏覽文件"],"ByAuthor|by":["作者:"],"CI configuration":["CI 配置"],"Cancel":["取消"],"ChangeTypeActionLabel|Pick into branch":["挑選到分支"],"ChangeTypeActionLabel|Revert in branch":["還原分支"],"ChangeTypeAction|Cherry-pick":["優選"],"ChangeType|commit":["提交"],"ChangeType|merge request":["合併請求"],"Changelog":["變更日誌"],"Charts":["統計圖"],"Cherry-pick this commit":["優選此提交"],"Cherry-pick this merge-request":["優選此合併請求"],"CiStatusLabel|canceled":["已取消"],"CiStatusLabel|created":["已創建"],"CiStatusLabel|failed":["已失敗"],"CiStatusLabel|manual action":["手動操作"],"CiStatusLabel|passed":["已通過"],"CiStatusLabel|passed with warnings":["已通過但有警告"],"CiStatusLabel|pending":["等待中"],"CiStatusLabel|skipped":["已跳過"],"CiStatusLabel|waiting for manual action":["等待手動操作"],"CiStatusText|blocked":["已阻塞"],"CiStatusText|canceled":["已取消"],"CiStatusText|created":["已創建"],"CiStatusText|failed":["已失敗"],"CiStatusText|manual":["待手動"],"CiStatusText|passed":["已通過"],"CiStatusText|pending":["等待中"],"CiStatusText|skipped":["已跳過"],"CiStatus|running":["運行中"],"Commit":["提交"],"Commit message":["提交信息"],"CommitMessage|Add %{file_name}":["添加 %{file_name}"],"Commits":["提交"],"Commits|History":["歷史"],"Committed by":["作者:"],"Compare":["比較"],"Contribution guide":["貢獻指南"],"Contributors":["貢獻者"],"Copy URL to clipboard":["複製URL到剪貼板"],"Copy commit SHA to clipboard":["複製提交 SHA 到剪貼板"],"Create New Directory":["創建新目錄"],"Create directory":["創建目錄"],"Create empty bare repository":["創建空的存儲庫"],"Create merge request":["創建合併請求"],"Create new...":["創建..."],"CreateNewFork|Fork":["派生"],"CreateTag|Tag":["標簽"],"Cron Timezone":["Cron 時區"],"Cron syntax":["Cron 語法"],"Custom":["自定義"],"Custom notification events":["自定義通知事件"],"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}.":["自定義通知級別繼承自參與級別。使用自定義通知級別,您會收到參與級別及選定事件的通知。想了解更多信息,請查看 %{notification_link}."],"Cycle Analytics":["週期分析"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Define a custom pattern with cron syntax":["使用 Cron 語法定義自定義模式"],"Delete":["刪除"],"Deploy":["部署"],"Description":["描述"],"Directory name":["目錄名稱"],"Don't show again":["不再顯示"],"Download":["下載"],"Download tar":["下載 tar"],"Download tar.bz2":["下載 tar.bz2"],"Download tar.gz":["下載 tar.gz"],"Download zip":["下載 zip"],"DownloadArtifacts|Download":["下載"],"DownloadCommit|Email Patches":["電子郵件補丁"],"DownloadCommit|Plain Diff":["Diff 文件"],"DownloadSource|Download":["下載"],"Edit":["編輯"],"Edit Pipeline Schedule %{id}":["編輯 %{id} 流水線計劃"],"Every day (at 4:00am)":["每天(淩晨4點)"],"Every month (on the 1st at 4:00am)":["每月1日(淩晨4點)"],"Every week (Sundays at 4:00am)":["每周日(淩晨4點)"],"Failed to change the owner":["無法變更所有者"],"Failed to remove the pipeline schedule":["無法刪除流水線計劃"],"Files":["文件"],"Find by path":["按路徑查找"],"Find file":["查找文件"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"Fork":["派生"],"ForkedFromProjectPath|Forked from":["派生自"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Go to your fork":["跳轉到派生項目"],"GoToYourFork|Fork":["跳轉到派生項目"],"Home":["首頁"],"Housekeeping successfully started":["已開始維護"],"Import repository":["導入存儲庫"],"Interval Pattern":["間隔模式"],"Introducing Cycle Analytics":["週期分析簡介"],"LFSStatus|Disabled":["停用"],"LFSStatus|Enabled":["啟用"],"Last %d day":["最後 %d 天"],"Last Pipeline":["最新流水線"],"Last Update":["最後更新"],"Last commit":["最後提交"],"Learn more in the":["了解更多"],"Leave group":["離開群組"],"Leave project":["離開項目"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"MissingSSHKeyWarningLink|add an SSH key":["添加壹個 SSH 公鑰"],"New Issue":["新議題"],"New Pipeline Schedule":["創建流水線計劃"],"New branch":["新分支"],"New directory":["新增目錄"],"New file":["新增文件"],"New issue":["新議題"],"New merge request":["新合併請求"],"New schedule":["新计划"],"New snippet":["新代碼片段"],"New tag":["新標籤"],"No repository":["沒有存儲庫"],"No schedules":["沒有計劃"],"Not available":["不可用"],"Not enough data":["數據不足"],"Notification events":["通知事件"],"NotificationEvent|Close issue":["關閉議題"],"NotificationEvent|Close merge request":["關閉合併請求"],"NotificationEvent|Failed pipeline":["流水線失敗"],"NotificationEvent|Merge merge request":["合併請求被合併"],"NotificationEvent|New issue":["新議題"],"NotificationEvent|New merge request":["新合併請求"],"NotificationEvent|New note":["新評論"],"NotificationEvent|Reassign issue":["重新指派議題"],"NotificationEvent|Reassign merge request":["重新指派合併請求"],"NotificationEvent|Reopen issue":["重新打開議題"],"NotificationEvent|Successful pipeline":["流水線成功完成"],"NotificationLevel|Custom":["自定義"],"NotificationLevel|Disabled":["停用"],"NotificationLevel|Global":["全局"],"NotificationLevel|On mention":["提及"],"NotificationLevel|Participate":["參與"],"NotificationLevel|Watch":["關注"],"OfSearchInADropdown|Filter":["篩選"],"OpenedNDaysAgo|Opened":["開始於"],"Options":["選項"],"Owner":["所有者"],"Pipeline":["流水線"],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":["流水線計劃"],"Pipeline Schedules":["流水線計劃"],"PipelineSchedules|Activated":["已激活"],"PipelineSchedules|Active":["激活"],"PipelineSchedules|All":["所有"],"PipelineSchedules|Inactive":["等待"],"PipelineSchedules|Next Run":["下壹個運行"],"PipelineSchedules|None":["無"],"PipelineSchedules|Provide a short description for this pipeline":["為此流水線提供簡短描述"],"PipelineSchedules|Take ownership":["取得所有權"],"PipelineSchedules|Target":["目標"],"Project '%{project_name}' queued for deletion.":["項目 '%{project_name}' 已進入刪除隊列。"],"Project '%{project_name}' was successfully created.":["項目 '%{project_name}' 已創建完成。"],"Project '%{project_name}' was successfully updated.":["項目 '%{project_name}' 已更新完成。"],"Project '%{project_name}' will be deleted.":["項目 '%{project_name}' 已刪除。"],"Project access must be granted explicitly to each user.":["項目訪問權限必須明確授權給每個用戶。"],"Project export could not be deleted.":["無法刪除項目導出。"],"Project export has been deleted.":["項目導出已刪除。"],"Project export link has expired. Please generate a new export from your project settings.":["項目導出鏈接已過期。請從項目設置中重新生成項目導出。"],"Project export started. A download link will be sent by email.":["項目導出已開始。下載鏈接將通過電子郵件發送。"],"Project home":["項目首頁"],"ProjectFeature|Disabled":["停用"],"ProjectFeature|Everyone with access":["任何人都可訪問"],"ProjectFeature|Only team members":["只有團隊成員"],"ProjectFileTree|Name":["名稱"],"ProjectLastActivity|Never":["從未"],"ProjectLifecycle|Stage":["階段"],"ProjectNetworkGraph|Graph":["分支圖"],"Read more":["了解更多"],"Readme":["自述文件"],"RefSwitcher|Branches":["分支"],"RefSwitcher|Tags":["標籤"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合併請求"],"Remind later":["稍後提醒"],"Remove project":["刪除項目"],"Request Access":["申請訪問"],"Revert this commit":["還原此提交"],"Revert this merge-request":["還原此合併請求"],"Save pipeline schedule":["保存流水線計劃"],"Schedule a new pipeline":["新增流水線計劃"],"Scheduling Pipelines":["流水線計劃"],"Search branches and tags":["搜索分支和標籤"],"Select Archive Format":["選擇下載格式"],"Select a timezone":["選擇時區"],"Select target branch":["選擇目標分支"],"Set a password on your account to pull or push via %{protocol}":["為賬號添加壹個用於推送或拉取的 %{protocol} 密碼。"],"Set up CI":["設置 CI"],"Set up Koding":["設置 Koding"],"Set up auto deploy":["設置自動部署"],"SetPasswordToCloneLink|set a password":["設置密碼"],"Showing %d event":["顯示 %d 個事件"],"Source code":["源代碼"],"StarProject|Star":["星標"],"Start a new merge request with these changes":["包含這些更改到 新合併請求"],"Switch branch/tag":["切換分支/標籤"],"Tag":["標籤"],"Tags":["標籤"],"Target Branch":["目標分支"],"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.":["編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"The fork relationship has been removed.":["派生關係已被刪除。"],"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.":["議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建壹個議題後,數據將自動添加到此處。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["流水線計劃會針對特定的分支或標簽在以後重復運行流水線。這些預定的流水線將根據其相關用戶繼承有限的項目訪問。"],"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.":["計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"The project can be accessed by any logged in user.":["該項目允許已登錄的用戶訪問。"],"The project can be accessed without any authentication.":["該項目允許任何人訪問。"],"The repository for this project does not exist.":["此項目的存儲庫不存在。"],"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.":["評審階段概述了從創建合併請求到合併的時間。當創建第壹個合併請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"This means you can not push code until you create an empty repository or import existing one.":["在創建壹個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合併或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Timeago|%s days ago":["%s 天前"],"Timeago|%s days remaining":["剩餘 %s 天"],"Timeago|%s hours remaining":["剩餘 %s 小時"],"Timeago|%s minutes ago":["%s 分鐘前"],"Timeago|%s minutes remaining":["剩餘 %s 分鐘"],"Timeago|%s months ago":["%s 個月前"],"Timeago|%s months remaining":["剩餘 %s 月"],"Timeago|%s seconds remaining":["剩餘 %s 秒"],"Timeago|%s weeks ago":["%s 星期前"],"Timeago|%s weeks remaining":["剩餘 %s 星期"],"Timeago|%s years ago":["%s 年前"],"Timeago|%s years remaining":["剩餘 %s 年"],"Timeago|1 day remaining":["剩餘 1 天"],"Timeago|1 hour remaining":["剩餘 1 小時"],"Timeago|1 minute remaining":["剩餘 1 分鐘"],"Timeago|1 month remaining":["剩餘 1 個月"],"Timeago|1 week remaining":["剩餘 1 星期"],"Timeago|1 year remaining":["剩餘 1 年"],"Timeago|Past due":["逾期"],"Timeago|a day ago":["1 天前"],"Timeago|a month ago":["1 個月前"],"Timeago|a week ago":["1 星期前"],"Timeago|a while":["剛剛"],"Timeago|a year ago":["1 年前"],"Timeago|about %s hours ago":["大約 %s 小時前"],"Timeago|about a minute ago":["大約 1 分鐘前"],"Timeago|about an hour ago":["大約 1 小時前"],"Timeago|in %s days":["在 %s 天"],"Timeago|in %s hours":["在 %s 小時"],"Timeago|in %s minutes":["在 %s 分鐘"],"Timeago|in %s months":["在 %s 個月"],"Timeago|in %s seconds":["在 %s 秒"],"Timeago|in %s weeks":["在 %s 星期"],"Timeago|in %s years":["在 %s 年"],"Timeago|in 1 day":["在 1 天"],"Timeago|in 1 hour":["在 1 小時"],"Timeago|in 1 minute":["在 1 分鐘"],"Timeago|in 1 month":["在 1 月"],"Timeago|in 1 week":["在 1 星期"],"Timeago|in 1 year":["在 1 年"],"Timeago|less than a minute ago":["不到 1 分鐘前"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Unstar":["取消星標"],"Upload New File":["上傳新文件"],"Upload file":["上傳文件"],"Use your global notification setting":["使用全局通知設置"],"VisibilityLevel|Internal":["內部"],"VisibilityLevel|Private":["私有"],"VisibilityLevel|Public":["公開"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"Withdraw Access Request":["取消訪問請求"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["您將要刪除 %{project_name_with_namespace}。\\n已刪除的項目無法恢復!\\n您確定繼續嗎?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["您將刪除與源項目 %{forked_from_project} 的派生關系。您確定繼續嗎?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["將 %{project_name_with_namespace} 轉義給另壹個所有者。您確定繼續嗎?"],"You can only add files when you are on a branch":["您只能在分支上添加文件"],"You must sign in to star a project":["您必須登錄才能對項目加星標"],"You need permission.":["您需要相關的權限。"],"You will not get any notifications via email":["您將不會收到任何通知郵件"],"You will only receive notifications for the events you choose":["您只會收到您選擇的事件通知"],"You will only receive notifications for threads you have participated in":["您只會收到您參與的主題的通知"],"You will receive notifications for any activity":["您將不會收到任何通知"],"You will receive notifications only for comments in which you were @mentioned":["您只會收到評論中提及(@)您的通知"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["在賬號上 %{set_password_link} 之前將無法通過 %{protocol} 拉取或推送代碼。"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["在賬號中添加 %{add_ssh_key_link} 之前您將無法通過 SSH 拉取或推送代碼。"],"Your name":["您的名字"],"day":["天"],"notification emails":["通知郵件"],"parent":["父級"],"pipeline schedules documentation":["流水線計劃文檔"],"with stage":["於階段"]}}}; \ No newline at end of file +var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-14 05:43-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://www.transifex.com/gitlab-zh/teams/75177/zh_HK/)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"%{commit_author_link} committed %{commit_timeago}":["由 %{commit_author_link} 提交於 %{commit_timeago}"],"About auto deploy":["關於自動部署"],"Active":["啟用"],"Activity":["活動"],"Add Changelog":["添加更新日誌"],"Add Contribution guide":["添加貢獻指南"],"Add License":["添加許可證"],"Add an SSH key to your profile to pull or push via SSH.":["新增壹個用於推送或拉取的 SSH 秘鑰到賬號中。"],"Add new directory":["添加新目錄"],"Archived project! Repository is read-only":["歸檔項目!存儲庫為只讀"],"Are you sure you want to delete this pipeline schedule?":["確定要刪除此流水線計劃嗎?"],"Attach a file by drag & drop or %{upload_link}":["拖放文件到此處或者 %{upload_link}"],"Branch":["分支"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["分支 %{branch_name} 已創建。如需設置自動部署, 請選擇合適的 GitLab CI Yaml 模板併提交更改。%{link_to_autodeploy_doc}"],"Branches":["分支"],"Browse files":["瀏覽文件"],"ByAuthor|by":["作者:"],"CI configuration":["CI 配置"],"Cancel":["取消"],"ChangeTypeActionLabel|Pick into branch":["挑選到分支"],"ChangeTypeActionLabel|Revert in branch":["還原分支"],"ChangeTypeAction|Cherry-pick":["優選"],"ChangeType|commit":["提交"],"ChangeType|merge request":["合併請求"],"Changelog":["更新日誌"],"Charts":["統計圖"],"Cherry-pick this commit":["優選此提交"],"Cherry-pick this merge-request":["優選此合併請求"],"CiStatusLabel|canceled":["已取消"],"CiStatusLabel|created":["已創建"],"CiStatusLabel|failed":["已失敗"],"CiStatusLabel|manual action":["手動操作"],"CiStatusLabel|passed":["已通過"],"CiStatusLabel|passed with warnings":["已通過但有警告"],"CiStatusLabel|pending":["等待中"],"CiStatusLabel|skipped":["已跳過"],"CiStatusLabel|waiting for manual action":["等待手動操作"],"CiStatusText|blocked":["已阻塞"],"CiStatusText|canceled":["已取消"],"CiStatusText|created":["已創建"],"CiStatusText|failed":["已失敗"],"CiStatusText|manual":["待手動"],"CiStatusText|passed":["已通過"],"CiStatusText|pending":["等待中"],"CiStatusText|skipped":["已跳過"],"CiStatus|running":["運行中"],"Commit":["提交"],"Commit message":["提交信息"],"CommitMessage|Add %{file_name}":["添加 %{file_name}"],"Commits":["提交"],"Commits|History":["歷史"],"Committed by":["提交於"],"Compare":["比較"],"Contribution guide":["貢獻指南"],"Contributors":["貢獻者"],"Copy URL to clipboard":["複製URL到剪貼板"],"Copy commit SHA to clipboard":["複製提交 SHA 到剪貼板"],"Create New Directory":["創建新目錄"],"Create directory":["創建目錄"],"Create empty bare repository":["創建空的存儲庫"],"Create merge request":["創建合併請求"],"Create new...":["創建..."],"CreateNewFork|Fork":["派生"],"CreateTag|Tag":["標簽"],"Cron Timezone":["Cron 時區"],"Cron syntax":["Cron 語法"],"Custom":["自定義"],"Custom notification events":["自定義通知事件"],"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}.":["自定義通知級別繼承自參與級別。使用自定義通知級別,您會收到參與級別及選定事件的通知。想了解更多信息,請查看 %{notification_link}."],"Cycle Analytics":["週期分析"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Define a custom pattern with cron syntax":["使用 Cron 語法定義自定義模式"],"Delete":["刪除"],"Deploy":["部署"],"Description":["描述"],"Directory name":["目錄名稱"],"Don't show again":["不再顯示"],"Download":["下載"],"Download tar":["下載 tar"],"Download tar.bz2":["下載 tar.bz2"],"Download tar.gz":["下載 tar.gz"],"Download zip":["下載 zip"],"DownloadArtifacts|Download":["下載"],"DownloadCommit|Email Patches":["電子郵件補丁"],"DownloadCommit|Plain Diff":["Diff 文件"],"DownloadSource|Download":["下載"],"Edit":["編輯"],"Edit Pipeline Schedule %{id}":["編輯 %{id} 流水線計劃"],"Every day (at 4:00am)":["每日執行(淩晨4點)"],"Every month (on the 1st at 4:00am)":["每月执行(第一天淩晨4點)"],"Every week (Sundays at 4:00am)":["每週執行(周日淩晨4點)"],"Failed to change the owner":["無法變更所有者"],"Failed to remove the pipeline schedule":["無法刪除流水線計劃"],"Files":["文件"],"Find by path":["按路徑查找"],"Find file":["查找文件"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"Fork":["派生"],"ForkedFromProjectPath|Forked from":["派生自"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Go to your fork":["跳轉到派生項目"],"GoToYourFork|Fork":["跳轉到派生項目"],"Home":["首頁"],"Housekeeping successfully started":["已開始維護"],"Import repository":["導入存儲庫"],"Interval Pattern":["重復週期"],"Introducing Cycle Analytics":["週期分析簡介"],"LFSStatus|Disabled":["停用"],"LFSStatus|Enabled":["啟用"],"Last %d day":["最近 %d 天"],"Last Pipeline":["最新流水線"],"Last Update":["最後更新"],"Last commit":["最後提交"],"Learn more in the":["了解更多"],"Leave group":["退出群組"],"Leave project":["退出項目"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"MissingSSHKeyWarningLink|add an SSH key":["添加壹個 SSH 公鑰"],"New Issue":["新增議題"],"New Pipeline Schedule":["創建流水線計劃"],"New branch":["新增分支"],"New directory":["新增目錄"],"New file":["新增文件"],"New issue":["新議題"],"New merge request":["新增合併請求"],"New schedule":["新增计划"],"New snippet":["新代碼片段"],"New tag":["新增標籤"],"No repository":["沒有存儲庫"],"No schedules":["沒有計劃"],"Not available":["不可用"],"Not enough data":["數據不足"],"Notification events":["通知事件"],"NotificationEvent|Close issue":["關閉議題"],"NotificationEvent|Close merge request":["關閉合併請求"],"NotificationEvent|Failed pipeline":["流水線失敗"],"NotificationEvent|Merge merge request":["合併請求被合併"],"NotificationEvent|New issue":["新增議題"],"NotificationEvent|New merge request":["新合併請求"],"NotificationEvent|New note":["新增評論"],"NotificationEvent|Reassign issue":["重新指派議題"],"NotificationEvent|Reassign merge request":["重新指派合併請求"],"NotificationEvent|Reopen issue":["重新打開議題"],"NotificationEvent|Successful pipeline":["流水線成功完成"],"NotificationLevel|Custom":["自定義"],"NotificationLevel|Disabled":["停用"],"NotificationLevel|Global":["全局"],"NotificationLevel|On mention":["提及"],"NotificationLevel|Participate":["參與"],"NotificationLevel|Watch":["關注"],"OfSearchInADropdown|Filter":["篩選"],"OpenedNDaysAgo|Opened":["開始於"],"Options":["選項"],"Owner":["所有者"],"Pipeline":["流水線"],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":["流水線計劃"],"Pipeline Schedules":["流水線計劃"],"PipelineSchedules|Activated":["是否啟用"],"PipelineSchedules|Active":["已啟用"],"PipelineSchedules|All":["所有"],"PipelineSchedules|Inactive":["未啟用"],"PipelineSchedules|Next Run":["下次運行時間"],"PipelineSchedules|None":["無"],"PipelineSchedules|Provide a short description for this pipeline":["為此流水線提供簡短描述"],"PipelineSchedules|Take ownership":["取得所有者"],"PipelineSchedules|Target":["目標"],"Project '%{project_name}' queued for deletion.":["項目 '%{project_name}' 已進入刪除隊列。"],"Project '%{project_name}' was successfully created.":["項目 '%{project_name}' 已創建成功。"],"Project '%{project_name}' was successfully updated.":["項目 '%{project_name}' 已更新完成。"],"Project '%{project_name}' will be deleted.":["項目 '%{project_name}' 將被刪除。"],"Project access must be granted explicitly to each user.":["項目訪問權限必須明確授權給每個用戶。"],"Project export could not be deleted.":["無法刪除項目導出。"],"Project export has been deleted.":["項目導出已刪除。"],"Project export link has expired. Please generate a new export from your project settings.":["項目導出鏈接已過期。請從項目設置中重新生成項目導出。"],"Project export started. A download link will be sent by email.":["項目導出已開始。下載鏈接將通過電子郵件發送。"],"Project home":["項目首頁"],"ProjectFeature|Disabled":["停用"],"ProjectFeature|Everyone with access":["任何人都可訪問"],"ProjectFeature|Only team members":["只有團隊成員"],"ProjectFileTree|Name":["名稱"],"ProjectLastActivity|Never":["從未"],"ProjectLifecycle|Stage":["階段"],"ProjectNetworkGraph|Graph":["分支圖"],"Read more":["了解更多"],"Readme":["自述文件"],"RefSwitcher|Branches":["分支"],"RefSwitcher|Tags":["標籤"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合併請求"],"Remind later":["稍後提醒"],"Remove project":["刪除項目"],"Request Access":["申請訪問"],"Revert this commit":["還原此提交"],"Revert this merge-request":["還原此合併請求"],"Save pipeline schedule":["保存流水線計劃"],"Schedule a new pipeline":["新建流水線計劃"],"Scheduling Pipelines":["流水線計劃"],"Search branches and tags":["搜索分支和標籤"],"Select Archive Format":["選擇下載格式"],"Select a timezone":["選擇時區"],"Select target branch":["選擇目標分支"],"Set a password on your account to pull or push via %{protocol}":["為賬號添加壹個用於推送或拉取的 %{protocol} 密碼。"],"Set up CI":["設置 CI"],"Set up Koding":["設置 Koding"],"Set up auto deploy":["設置自動部署"],"SetPasswordToCloneLink|set a password":["設置密碼"],"Showing %d event":["顯示 %d 個事件"],"Source code":["源代碼"],"StarProject|Star":["星標"],"Start a new merge request with these changes":["由此更改創建新合併請求"],"Switch branch/tag":["切換分支/標籤"],"Tag":["標籤"],"Tags":["標籤"],"Target Branch":["目標分支"],"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.":["編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"The fork relationship has been removed.":["派生關係已被刪除。"],"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.":["議題階段概述了從創建議題到將議題添加到裏程碑或議題看板的時間。創建第壹個議題後,數據將自動添加到此處.。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["流水線計劃會週期性重復運行指定分支或標簽的流水線。這些流水線將根據其關聯用戶繼承有限的項目訪問權限。"],"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.":["計劃階段概述了從議題添加到日程到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"The project can be accessed by any logged in user.":["該項目允許已登錄的用戶訪問。"],"The project can be accessed without any authentication.":["該項目允許任何人訪問。"],"The repository for this project does not exist.":["此項目的存儲庫不存在。"],"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.":["評審階段概述了從創建合併請求到合併的時間。當創建第壹個合併請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"This means you can not push code until you create an empty repository or import existing one.":["在創建壹個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合併或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Timeago|%s days ago":["%s 天前"],"Timeago|%s days remaining":["剩餘 %s 天"],"Timeago|%s hours remaining":["剩餘 %s 小時"],"Timeago|%s minutes ago":["%s 分鐘前"],"Timeago|%s minutes remaining":["剩餘 %s 分鐘"],"Timeago|%s months ago":["%s 個月前"],"Timeago|%s months remaining":["剩餘 %s 月"],"Timeago|%s seconds remaining":["剩餘 %s 秒"],"Timeago|%s weeks ago":["%s 星期前"],"Timeago|%s weeks remaining":["剩餘 %s 星期"],"Timeago|%s years ago":["%s 年前"],"Timeago|%s years remaining":["剩餘 %s 年"],"Timeago|1 day remaining":["剩餘 1 天"],"Timeago|1 hour remaining":["剩餘 1 小時"],"Timeago|1 minute remaining":["剩餘 1 分鐘"],"Timeago|1 month remaining":["剩餘 1 個月"],"Timeago|1 week remaining":["剩餘 1 星期"],"Timeago|1 year remaining":["剩餘 1 年"],"Timeago|Past due":["逾期"],"Timeago|a day ago":["1 天前"],"Timeago|a month ago":["1 個月前"],"Timeago|a week ago":["1 星期前"],"Timeago|a while":["剛剛"],"Timeago|a year ago":["1 年前"],"Timeago|about %s hours ago":["約 %s 小時前"],"Timeago|about a minute ago":["約 1 分鐘前"],"Timeago|about an hour ago":["約 1 小時前"],"Timeago|in %s days":[" %s 天後"],"Timeago|in %s hours":[" %s 小時後"],"Timeago|in %s minutes":[" %s 分鐘後"],"Timeago|in %s months":[" %s 個月後"],"Timeago|in %s seconds":[" %s 秒後"],"Timeago|in %s weeks":[" %s 星期後"],"Timeago|in %s years":[" %s 年後"],"Timeago|in 1 day":[" 1 天後"],"Timeago|in 1 hour":[" 1 小時後"],"Timeago|in 1 minute":[" 1 分鐘後"],"Timeago|in 1 month":[" 1 月後"],"Timeago|in 1 week":[" 1 星期後"],"Timeago|in 1 year":[" 1 年後"],"Timeago|less than a minute ago":["不到 1 分鐘前"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Unstar":["取消星標"],"Upload New File":["上傳新文件"],"Upload file":["上傳文件"],"Use your global notification setting":["使用全局通知設置"],"VisibilityLevel|Internal":["內部"],"VisibilityLevel|Private":["私有"],"VisibilityLevel|Public":["公開"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"Withdraw Access Request":["取消訪問請求"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["即將要刪除 %{project_name_with_namespace}。\\n已刪除的項目無法恢復!\\n確定繼續嗎?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["即將刪除與源項目 %{forked_from_project} 的派生關系。確定繼續嗎?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["即將 %{project_name_with_namespace} 轉義給另壹個所有者。確定繼續嗎?"],"You can only add files when you are on a branch":["只能在分支上添加文件"],"You must sign in to star a project":["必須登錄才能對項目加星標"],"You need permission.":["需要相關的權限。"],"You will not get any notifications via email":["不會收到任何通知郵件"],"You will only receive notifications for the events you choose":["只接收您選擇的事件通知"],"You will only receive notifications for threads you have participated in":["只接收您參與的主題的通知"],"You will receive notifications for any activity":["接收所有活動的通知"],"You will receive notifications only for comments in which you were @mentioned":["只接收評論中提及(@)您的通知"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["在賬號上 %{set_password_link} 之前將無法通過 %{protocol} 拉取或推送代碼。"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["在賬號中 %{add_ssh_key_link} 之前將無法通過 SSH 拉取或推送代碼。"],"Your name":["您的名字"],"day":["天"],"notification emails":["通知郵件"],"parent":["父級"],"pipeline schedules documentation":["流水線計劃文檔"],"with stage":["於階段"]}}}; \ No newline at end of file diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po index 8fbc38ba5af..0be8887cc61 100644 --- a/locale/zh_HK/gitlab.po +++ b/locale/zh_HK/gitlab.po @@ -7,7 +7,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-13 04:07-0400\n" +"PO-Revision-Date: 2017-06-14 05:43-0400\n" "Last-Translator: Huang Tao \n" "Language-Team: Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)\n" "Language: zh-HK\n" @@ -21,13 +21,13 @@ msgid "About auto deploy" msgstr "關於自動部署" msgid "Active" -msgstr "激活" +msgstr "啟用" msgid "Activity" msgstr "活動" msgid "Add Changelog" -msgstr "添加變更日誌" +msgstr "添加更新日誌" msgid "Add Contribution guide" msgstr "添加貢獻指南" @@ -45,7 +45,7 @@ msgid "Archived project! Repository is read-only" msgstr "歸檔項目!存儲庫為只讀" msgid "Are you sure you want to delete this pipeline schedule?" -msgstr "您確定要刪除此流水線計劃嗎?" +msgstr "確定要刪除此流水線計劃嗎?" msgid "Attach a file by drag & drop or %{upload_link}" msgstr "拖放文件到此處或者 %{upload_link}" @@ -59,7 +59,7 @@ msgid "" "choose a GitLab CI Yaml template and commit your changes. " "%{link_to_autodeploy_doc}" msgstr "" -"分支 %{branch_name} 已創建。如要設置自動部署, 請選擇合適的 GitLab CI Yaml " +"分支 %{branch_name} 已創建。如需設置自動部署, 請選擇合適的 GitLab CI Yaml " "模板併提交更改。%{link_to_autodeploy_doc}" msgid "Branches" @@ -93,7 +93,7 @@ msgid "ChangeType|merge request" msgstr "合併請求" msgid "Changelog" -msgstr "變更日誌" +msgstr "更新日誌" msgid "Charts" msgstr "統計圖" @@ -175,7 +175,7 @@ msgid "Commits|History" msgstr "歷史" msgid "Committed by" -msgstr "作者:" +msgstr "提交於" msgid "Compare" msgstr "比較" @@ -314,13 +314,13 @@ msgid "Edit Pipeline Schedule %{id}" msgstr "編輯 %{id} 流水線計劃" msgid "Every day (at 4:00am)" -msgstr "每天(淩晨4點)" +msgstr "每日執行(淩晨4點)" msgid "Every month (on the 1st at 4:00am)" -msgstr "每月1日(淩晨4點)" +msgstr "每月执行(第一天淩晨4點)" msgid "Every week (Sundays at 4:00am)" -msgstr "每周日(淩晨4點)" +msgstr "每週執行(周日淩晨4點)" msgid "Failed to change the owner" msgstr "無法變更所有者" @@ -372,7 +372,7 @@ msgid "Import repository" msgstr "導入存儲庫" msgid "Interval Pattern" -msgstr "間隔模式" +msgstr "重復週期" msgid "Introducing Cycle Analytics" msgstr "週期分析簡介" @@ -385,7 +385,7 @@ msgstr "啟用" msgid "Last %d day" msgid_plural "Last %d days" -msgstr[0] "最後 %d 天" +msgstr[0] "最近 %d 天" msgid "Last Pipeline" msgstr "最新流水線" @@ -400,10 +400,10 @@ msgid "Learn more in the" msgstr "了解更多" msgid "Leave group" -msgstr "離開群組" +msgstr "退出群組" msgid "Leave project" -msgstr "離開項目" +msgstr "退出項目" msgid "Limited to showing %d event at most" msgid_plural "Limited to showing %d events at most" @@ -417,13 +417,13 @@ msgstr "添加壹個 SSH 公鑰" msgid "New Issue" msgid_plural "New Issues" -msgstr[0] "新議題" +msgstr[0] "新增議題" msgid "New Pipeline Schedule" msgstr "創建流水線計劃" msgid "New branch" -msgstr "新分支" +msgstr "新增分支" msgid "New directory" msgstr "新增目錄" @@ -435,16 +435,16 @@ msgid "New issue" msgstr "新議題" msgid "New merge request" -msgstr "新合併請求" +msgstr "新增合併請求" msgid "New schedule" -msgstr "新计划" +msgstr "新增计划" msgid "New snippet" msgstr "新代碼片段" msgid "New tag" -msgstr "新標籤" +msgstr "新增標籤" msgid "No repository" msgstr "沒有存儲庫" @@ -474,13 +474,13 @@ msgid "NotificationEvent|Merge merge request" msgstr "合併請求被合併" msgid "NotificationEvent|New issue" -msgstr "新議題" +msgstr "新增議題" msgid "NotificationEvent|New merge request" msgstr "新合併請求" msgid "NotificationEvent|New note" -msgstr "新評論" +msgstr "新增評論" msgid "NotificationEvent|Reassign issue" msgstr "重新指派議題" @@ -537,19 +537,19 @@ msgid "Pipeline Schedules" msgstr "流水線計劃" msgid "PipelineSchedules|Activated" -msgstr "已激活" +msgstr "是否啟用" msgid "PipelineSchedules|Active" -msgstr "激活" +msgstr "已啟用" msgid "PipelineSchedules|All" msgstr "所有" msgid "PipelineSchedules|Inactive" -msgstr "等待" +msgstr "未啟用" msgid "PipelineSchedules|Next Run" -msgstr "下壹個運行" +msgstr "下次運行時間" msgid "PipelineSchedules|None" msgstr "無" @@ -558,7 +558,7 @@ msgid "PipelineSchedules|Provide a short description for this pipeline" msgstr "為此流水線提供簡短描述" msgid "PipelineSchedules|Take ownership" -msgstr "取得所有權" +msgstr "取得所有者" msgid "PipelineSchedules|Target" msgstr "目標" @@ -567,13 +567,13 @@ msgid "Project '%{project_name}' queued for deletion." msgstr "項目 '%{project_name}' 已進入刪除隊列。" msgid "Project '%{project_name}' was successfully created." -msgstr "項目 '%{project_name}' 已創建完成。" +msgstr "項目 '%{project_name}' 已創建成功。" msgid "Project '%{project_name}' was successfully updated." msgstr "項目 '%{project_name}' 已更新完成。" msgid "Project '%{project_name}' will be deleted." -msgstr "項目 '%{project_name}' 已刪除。" +msgstr "項目 '%{project_name}' 將被刪除。" msgid "Project access must be granted explicitly to each user." msgstr "項目訪問權限必須明確授權給每個用戶。" @@ -665,7 +665,7 @@ msgid "Save pipeline schedule" msgstr "保存流水線計劃" msgid "Schedule a new pipeline" -msgstr "新增流水線計劃" +msgstr "新建流水線計劃" msgid "Scheduling Pipelines" msgstr "流水線計劃" @@ -708,7 +708,7 @@ msgid "StarProject|Star" msgstr "星標" msgid "Start a new merge request with these changes" -msgstr "包含這些更改到 新合併請求" +msgstr "由此更改創建新合併請求" msgid "Switch branch/tag" msgstr "切換分支/標籤" @@ -739,7 +739,7 @@ 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 "議題階段概述了從創建議題到將議題設置裏程碑或將議題添加到議題看板的時間。創建壹個議題後,數據將自動添加到此處。" +msgstr "議題階段概述了從創建議題到將議題添加到裏程碑或議題看板的時間。創建第壹個議題後,數據將自動添加到此處.。" msgid "The phase of the development lifecycle." msgstr "項目生命週期中的各個階段。" @@ -748,13 +748,13 @@ 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 "流水線計劃會針對特定的分支或標簽在以後重復運行流水線。這些預定的流水線將根據其相關用戶繼承有限的項目訪問。" +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 "計劃階段概述了從議題添加到日程後到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。" +msgstr "計劃階段概述了從議題添加到日程到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。" msgid "" "The production stage shows the total time it takes between creating an issue " @@ -888,52 +888,52 @@ msgid "Timeago|a year ago" msgstr "1 年前" msgid "Timeago|about %s hours ago" -msgstr "大約 %s 小時前" +msgstr "約 %s 小時前" msgid "Timeago|about a minute ago" -msgstr "大約 1 分鐘前" +msgstr "約 1 分鐘前" msgid "Timeago|about an hour ago" -msgstr "大約 1 小時前" +msgstr "約 1 小時前" msgid "Timeago|in %s days" -msgstr "在 %s 天" +msgstr " %s 天後" msgid "Timeago|in %s hours" -msgstr "在 %s 小時" +msgstr " %s 小時後" msgid "Timeago|in %s minutes" -msgstr "在 %s 分鐘" +msgstr " %s 分鐘後" msgid "Timeago|in %s months" -msgstr "在 %s 個月" +msgstr " %s 個月後" msgid "Timeago|in %s seconds" -msgstr "在 %s 秒" +msgstr " %s 秒後" msgid "Timeago|in %s weeks" -msgstr "在 %s 星期" +msgstr " %s 星期後" msgid "Timeago|in %s years" -msgstr "在 %s 年" +msgstr " %s 年後" msgid "Timeago|in 1 day" -msgstr "在 1 天" +msgstr " 1 天後" msgid "Timeago|in 1 hour" -msgstr "在 1 小時" +msgstr " 1 小時後" msgid "Timeago|in 1 minute" -msgstr "在 1 分鐘" +msgstr " 1 分鐘後" msgid "Timeago|in 1 month" -msgstr "在 1 月" +msgstr " 1 月後" msgid "Timeago|in 1 week" -msgstr "在 1 星期" +msgstr " 1 星期後" msgid "Timeago|in 1 year" -msgstr "在 1 年" +msgstr " 1 年後" msgid "Timeago|less than a minute ago" msgstr "不到 1 分鐘前" @@ -989,46 +989,46 @@ msgid "" "You are going to remove %{project_name_with_namespace}.\n" "Removed project CANNOT be restored!\n" "Are you ABSOLUTELY sure?" -msgstr "您將要刪除 %{project_name_with_namespace}。\n" +msgstr "即將要刪除 %{project_name_with_namespace}。\n" "已刪除的項目無法恢復!\n" -"您確定繼續嗎?" +"確定繼續嗎?" msgid "" "You are going to remove the fork relationship to source project " "%{forked_from_project}. Are you ABSOLUTELY sure?" -msgstr "您將刪除與源項目 %{forked_from_project} 的派生關系。您確定繼續嗎?" +msgstr "即將刪除與源項目 %{forked_from_project} 的派生關系。確定繼續嗎?" msgid "" "You are going to transfer %{project_name_with_namespace} to another owner. " "Are you ABSOLUTELY sure?" -msgstr "將 %{project_name_with_namespace} 轉義給另壹個所有者。您確定繼續嗎?" +msgstr "即將 %{project_name_with_namespace} 轉義給另壹個所有者。確定繼續嗎?" msgid "You can only add files when you are on a branch" -msgstr "您只能在分支上添加文件" +msgstr "只能在分支上添加文件" msgid "You must sign in to star a project" -msgstr "您必須登錄才能對項目加星標" +msgstr "必須登錄才能對項目加星標" msgid "You need permission." -msgstr "您需要相關的權限。" +msgstr "需要相關的權限。" msgid "You will not get any notifications via email" -msgstr "您將不會收到任何通知郵件" +msgstr "不會收到任何通知郵件" msgid "You will only receive notifications for the events you choose" -msgstr "您只會收到您選擇的事件通知" +msgstr "只接收您選擇的事件通知" msgid "" "You will only receive notifications for threads you have participated in" -msgstr "您只會收到您參與的主題的通知" +msgstr "只接收您參與的主題的通知" msgid "You will receive notifications for any activity" -msgstr "您將不會收到任何通知" +msgstr "接收所有活動的通知" msgid "" "You will receive notifications only for comments in which you were " "@mentioned" -msgstr "您只會收到評論中提及(@)您的通知" +msgstr "只接收評論中提及(@)您的通知" msgid "" "You won't be able to pull or push project code via %{protocol} until you " @@ -1038,7 +1038,7 @@ msgstr "在賬號上 %{set_password_link} 之前將無法通過 %{protocol} 拉 msgid "" "You won't be able to pull or push project code via SSH until you " "%{add_ssh_key_link} to your profile" -msgstr "在賬號中添加 %{add_ssh_key_link} 之前您將無法通過 SSH 拉取或推送代碼。" +msgstr "在賬號中 %{add_ssh_key_link} 之前將無法通過 SSH 拉取或推送代碼。" msgid "Your name" msgstr "您的名字" From 56b14667ed502cf62dee984c5754a8ef833ba103 Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Thu, 15 Jun 2017 17:46:15 +1000 Subject: [PATCH 0080/1380] hot reloading for .vue files --- config/webpack.config.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/webpack.config.js b/config/webpack.config.js index 3c2455ebf35..8f2c2f332c5 100644 --- a/config/webpack.config.js +++ b/config/webpack.config.js @@ -249,6 +249,7 @@ if (IS_DEV_SERVER) { port: DEV_SERVER_PORT, headers: { 'Access-Control-Allow-Origin': '*' }, stats: 'errors-only', + hot: DEV_SERVER_LIVERELOAD, inline: DEV_SERVER_LIVERELOAD }; config.output.publicPath = '//' + DEV_SERVER_HOST + ':' + DEV_SERVER_PORT + config.output.publicPath; @@ -256,6 +257,9 @@ if (IS_DEV_SERVER) { // watch node_modules for changes if we encounter a missing module compile error new WatchMissingNodeModulesPlugin(path.join(ROOT_PATH, 'node_modules')) ); + if (DEV_SERVER_LIVERELOAD) { + config.plugins.push(new webpack.HotModuleReplacementPlugin()); + } } if (WEBPACK_REPORT) { From c883883d9192d0801a30d45da80bc30f452bfdc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Thu, 15 Jun 2017 18:42:50 +0800 Subject: [PATCH 0081/1380] translation optimization in synchronous reviews --- app/assets/javascripts/locale/zh_HK/app.js | 2 +- locale/zh_HK/gitlab.po | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/locale/zh_HK/app.js b/app/assets/javascripts/locale/zh_HK/app.js index b43910dc641..b22262bb24d 100644 --- a/app/assets/javascripts/locale/zh_HK/app.js +++ b/app/assets/javascripts/locale/zh_HK/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-14 05:43-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://www.transifex.com/gitlab-zh/teams/75177/zh_HK/)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"%{commit_author_link} committed %{commit_timeago}":["由 %{commit_author_link} 提交於 %{commit_timeago}"],"About auto deploy":["關於自動部署"],"Active":["啟用"],"Activity":["活動"],"Add Changelog":["添加更新日誌"],"Add Contribution guide":["添加貢獻指南"],"Add License":["添加許可證"],"Add an SSH key to your profile to pull or push via SSH.":["新增壹個用於推送或拉取的 SSH 秘鑰到賬號中。"],"Add new directory":["添加新目錄"],"Archived project! Repository is read-only":["歸檔項目!存儲庫為只讀"],"Are you sure you want to delete this pipeline schedule?":["確定要刪除此流水線計劃嗎?"],"Attach a file by drag & drop or %{upload_link}":["拖放文件到此處或者 %{upload_link}"],"Branch":["分支"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["分支 %{branch_name} 已創建。如需設置自動部署, 請選擇合適的 GitLab CI Yaml 模板併提交更改。%{link_to_autodeploy_doc}"],"Branches":["分支"],"Browse files":["瀏覽文件"],"ByAuthor|by":["作者:"],"CI configuration":["CI 配置"],"Cancel":["取消"],"ChangeTypeActionLabel|Pick into branch":["挑選到分支"],"ChangeTypeActionLabel|Revert in branch":["還原分支"],"ChangeTypeAction|Cherry-pick":["優選"],"ChangeType|commit":["提交"],"ChangeType|merge request":["合併請求"],"Changelog":["更新日誌"],"Charts":["統計圖"],"Cherry-pick this commit":["優選此提交"],"Cherry-pick this merge-request":["優選此合併請求"],"CiStatusLabel|canceled":["已取消"],"CiStatusLabel|created":["已創建"],"CiStatusLabel|failed":["已失敗"],"CiStatusLabel|manual action":["手動操作"],"CiStatusLabel|passed":["已通過"],"CiStatusLabel|passed with warnings":["已通過但有警告"],"CiStatusLabel|pending":["等待中"],"CiStatusLabel|skipped":["已跳過"],"CiStatusLabel|waiting for manual action":["等待手動操作"],"CiStatusText|blocked":["已阻塞"],"CiStatusText|canceled":["已取消"],"CiStatusText|created":["已創建"],"CiStatusText|failed":["已失敗"],"CiStatusText|manual":["待手動"],"CiStatusText|passed":["已通過"],"CiStatusText|pending":["等待中"],"CiStatusText|skipped":["已跳過"],"CiStatus|running":["運行中"],"Commit":["提交"],"Commit message":["提交信息"],"CommitMessage|Add %{file_name}":["添加 %{file_name}"],"Commits":["提交"],"Commits|History":["歷史"],"Committed by":["提交於"],"Compare":["比較"],"Contribution guide":["貢獻指南"],"Contributors":["貢獻者"],"Copy URL to clipboard":["複製URL到剪貼板"],"Copy commit SHA to clipboard":["複製提交 SHA 到剪貼板"],"Create New Directory":["創建新目錄"],"Create directory":["創建目錄"],"Create empty bare repository":["創建空的存儲庫"],"Create merge request":["創建合併請求"],"Create new...":["創建..."],"CreateNewFork|Fork":["派生"],"CreateTag|Tag":["標簽"],"Cron Timezone":["Cron 時區"],"Cron syntax":["Cron 語法"],"Custom":["自定義"],"Custom notification events":["自定義通知事件"],"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}.":["自定義通知級別繼承自參與級別。使用自定義通知級別,您會收到參與級別及選定事件的通知。想了解更多信息,請查看 %{notification_link}."],"Cycle Analytics":["週期分析"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Define a custom pattern with cron syntax":["使用 Cron 語法定義自定義模式"],"Delete":["刪除"],"Deploy":["部署"],"Description":["描述"],"Directory name":["目錄名稱"],"Don't show again":["不再顯示"],"Download":["下載"],"Download tar":["下載 tar"],"Download tar.bz2":["下載 tar.bz2"],"Download tar.gz":["下載 tar.gz"],"Download zip":["下載 zip"],"DownloadArtifacts|Download":["下載"],"DownloadCommit|Email Patches":["電子郵件補丁"],"DownloadCommit|Plain Diff":["Diff 文件"],"DownloadSource|Download":["下載"],"Edit":["編輯"],"Edit Pipeline Schedule %{id}":["編輯 %{id} 流水線計劃"],"Every day (at 4:00am)":["每日執行(淩晨4點)"],"Every month (on the 1st at 4:00am)":["每月执行(第一天淩晨4點)"],"Every week (Sundays at 4:00am)":["每週執行(周日淩晨4點)"],"Failed to change the owner":["無法變更所有者"],"Failed to remove the pipeline schedule":["無法刪除流水線計劃"],"Files":["文件"],"Find by path":["按路徑查找"],"Find file":["查找文件"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"Fork":["派生"],"ForkedFromProjectPath|Forked from":["派生自"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Go to your fork":["跳轉到派生項目"],"GoToYourFork|Fork":["跳轉到派生項目"],"Home":["首頁"],"Housekeeping successfully started":["已開始維護"],"Import repository":["導入存儲庫"],"Interval Pattern":["重復週期"],"Introducing Cycle Analytics":["週期分析簡介"],"LFSStatus|Disabled":["停用"],"LFSStatus|Enabled":["啟用"],"Last %d day":["最近 %d 天"],"Last Pipeline":["最新流水線"],"Last Update":["最後更新"],"Last commit":["最後提交"],"Learn more in the":["了解更多"],"Leave group":["退出群組"],"Leave project":["退出項目"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"MissingSSHKeyWarningLink|add an SSH key":["添加壹個 SSH 公鑰"],"New Issue":["新增議題"],"New Pipeline Schedule":["創建流水線計劃"],"New branch":["新增分支"],"New directory":["新增目錄"],"New file":["新增文件"],"New issue":["新議題"],"New merge request":["新增合併請求"],"New schedule":["新增计划"],"New snippet":["新代碼片段"],"New tag":["新增標籤"],"No repository":["沒有存儲庫"],"No schedules":["沒有計劃"],"Not available":["不可用"],"Not enough data":["數據不足"],"Notification events":["通知事件"],"NotificationEvent|Close issue":["關閉議題"],"NotificationEvent|Close merge request":["關閉合併請求"],"NotificationEvent|Failed pipeline":["流水線失敗"],"NotificationEvent|Merge merge request":["合併請求被合併"],"NotificationEvent|New issue":["新增議題"],"NotificationEvent|New merge request":["新合併請求"],"NotificationEvent|New note":["新增評論"],"NotificationEvent|Reassign issue":["重新指派議題"],"NotificationEvent|Reassign merge request":["重新指派合併請求"],"NotificationEvent|Reopen issue":["重新打開議題"],"NotificationEvent|Successful pipeline":["流水線成功完成"],"NotificationLevel|Custom":["自定義"],"NotificationLevel|Disabled":["停用"],"NotificationLevel|Global":["全局"],"NotificationLevel|On mention":["提及"],"NotificationLevel|Participate":["參與"],"NotificationLevel|Watch":["關注"],"OfSearchInADropdown|Filter":["篩選"],"OpenedNDaysAgo|Opened":["開始於"],"Options":["選項"],"Owner":["所有者"],"Pipeline":["流水線"],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":["流水線計劃"],"Pipeline Schedules":["流水線計劃"],"PipelineSchedules|Activated":["是否啟用"],"PipelineSchedules|Active":["已啟用"],"PipelineSchedules|All":["所有"],"PipelineSchedules|Inactive":["未啟用"],"PipelineSchedules|Next Run":["下次運行時間"],"PipelineSchedules|None":["無"],"PipelineSchedules|Provide a short description for this pipeline":["為此流水線提供簡短描述"],"PipelineSchedules|Take ownership":["取得所有者"],"PipelineSchedules|Target":["目標"],"Project '%{project_name}' queued for deletion.":["項目 '%{project_name}' 已進入刪除隊列。"],"Project '%{project_name}' was successfully created.":["項目 '%{project_name}' 已創建成功。"],"Project '%{project_name}' was successfully updated.":["項目 '%{project_name}' 已更新完成。"],"Project '%{project_name}' will be deleted.":["項目 '%{project_name}' 將被刪除。"],"Project access must be granted explicitly to each user.":["項目訪問權限必須明確授權給每個用戶。"],"Project export could not be deleted.":["無法刪除項目導出。"],"Project export has been deleted.":["項目導出已刪除。"],"Project export link has expired. Please generate a new export from your project settings.":["項目導出鏈接已過期。請從項目設置中重新生成項目導出。"],"Project export started. A download link will be sent by email.":["項目導出已開始。下載鏈接將通過電子郵件發送。"],"Project home":["項目首頁"],"ProjectFeature|Disabled":["停用"],"ProjectFeature|Everyone with access":["任何人都可訪問"],"ProjectFeature|Only team members":["只有團隊成員"],"ProjectFileTree|Name":["名稱"],"ProjectLastActivity|Never":["從未"],"ProjectLifecycle|Stage":["階段"],"ProjectNetworkGraph|Graph":["分支圖"],"Read more":["了解更多"],"Readme":["自述文件"],"RefSwitcher|Branches":["分支"],"RefSwitcher|Tags":["標籤"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合併請求"],"Remind later":["稍後提醒"],"Remove project":["刪除項目"],"Request Access":["申請訪問"],"Revert this commit":["還原此提交"],"Revert this merge-request":["還原此合併請求"],"Save pipeline schedule":["保存流水線計劃"],"Schedule a new pipeline":["新建流水線計劃"],"Scheduling Pipelines":["流水線計劃"],"Search branches and tags":["搜索分支和標籤"],"Select Archive Format":["選擇下載格式"],"Select a timezone":["選擇時區"],"Select target branch":["選擇目標分支"],"Set a password on your account to pull or push via %{protocol}":["為賬號添加壹個用於推送或拉取的 %{protocol} 密碼。"],"Set up CI":["設置 CI"],"Set up Koding":["設置 Koding"],"Set up auto deploy":["設置自動部署"],"SetPasswordToCloneLink|set a password":["設置密碼"],"Showing %d event":["顯示 %d 個事件"],"Source code":["源代碼"],"StarProject|Star":["星標"],"Start a new merge request with these changes":["由此更改創建新合併請求"],"Switch branch/tag":["切換分支/標籤"],"Tag":["標籤"],"Tags":["標籤"],"Target Branch":["目標分支"],"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.":["編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"The fork relationship has been removed.":["派生關係已被刪除。"],"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.":["議題階段概述了從創建議題到將議題添加到裏程碑或議題看板的時間。創建第壹個議題後,數據將自動添加到此處.。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["流水線計劃會週期性重復運行指定分支或標簽的流水線。這些流水線將根據其關聯用戶繼承有限的項目訪問權限。"],"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.":["計劃階段概述了從議題添加到日程到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"The project can be accessed by any logged in user.":["該項目允許已登錄的用戶訪問。"],"The project can be accessed without any authentication.":["該項目允許任何人訪問。"],"The repository for this project does not exist.":["此項目的存儲庫不存在。"],"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.":["評審階段概述了從創建合併請求到合併的時間。當創建第壹個合併請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"This means you can not push code until you create an empty repository or import existing one.":["在創建壹個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合併或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Timeago|%s days ago":["%s 天前"],"Timeago|%s days remaining":["剩餘 %s 天"],"Timeago|%s hours remaining":["剩餘 %s 小時"],"Timeago|%s minutes ago":["%s 分鐘前"],"Timeago|%s minutes remaining":["剩餘 %s 分鐘"],"Timeago|%s months ago":["%s 個月前"],"Timeago|%s months remaining":["剩餘 %s 月"],"Timeago|%s seconds remaining":["剩餘 %s 秒"],"Timeago|%s weeks ago":["%s 星期前"],"Timeago|%s weeks remaining":["剩餘 %s 星期"],"Timeago|%s years ago":["%s 年前"],"Timeago|%s years remaining":["剩餘 %s 年"],"Timeago|1 day remaining":["剩餘 1 天"],"Timeago|1 hour remaining":["剩餘 1 小時"],"Timeago|1 minute remaining":["剩餘 1 分鐘"],"Timeago|1 month remaining":["剩餘 1 個月"],"Timeago|1 week remaining":["剩餘 1 星期"],"Timeago|1 year remaining":["剩餘 1 年"],"Timeago|Past due":["逾期"],"Timeago|a day ago":["1 天前"],"Timeago|a month ago":["1 個月前"],"Timeago|a week ago":["1 星期前"],"Timeago|a while":["剛剛"],"Timeago|a year ago":["1 年前"],"Timeago|about %s hours ago":["約 %s 小時前"],"Timeago|about a minute ago":["約 1 分鐘前"],"Timeago|about an hour ago":["約 1 小時前"],"Timeago|in %s days":[" %s 天後"],"Timeago|in %s hours":[" %s 小時後"],"Timeago|in %s minutes":[" %s 分鐘後"],"Timeago|in %s months":[" %s 個月後"],"Timeago|in %s seconds":[" %s 秒後"],"Timeago|in %s weeks":[" %s 星期後"],"Timeago|in %s years":[" %s 年後"],"Timeago|in 1 day":[" 1 天後"],"Timeago|in 1 hour":[" 1 小時後"],"Timeago|in 1 minute":[" 1 分鐘後"],"Timeago|in 1 month":[" 1 月後"],"Timeago|in 1 week":[" 1 星期後"],"Timeago|in 1 year":[" 1 年後"],"Timeago|less than a minute ago":["不到 1 分鐘前"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Unstar":["取消星標"],"Upload New File":["上傳新文件"],"Upload file":["上傳文件"],"Use your global notification setting":["使用全局通知設置"],"VisibilityLevel|Internal":["內部"],"VisibilityLevel|Private":["私有"],"VisibilityLevel|Public":["公開"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"Withdraw Access Request":["取消訪問請求"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["即將要刪除 %{project_name_with_namespace}。\\n已刪除的項目無法恢復!\\n確定繼續嗎?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["即將刪除與源項目 %{forked_from_project} 的派生關系。確定繼續嗎?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["即將 %{project_name_with_namespace} 轉義給另壹個所有者。確定繼續嗎?"],"You can only add files when you are on a branch":["只能在分支上添加文件"],"You must sign in to star a project":["必須登錄才能對項目加星標"],"You need permission.":["需要相關的權限。"],"You will not get any notifications via email":["不會收到任何通知郵件"],"You will only receive notifications for the events you choose":["只接收您選擇的事件通知"],"You will only receive notifications for threads you have participated in":["只接收您參與的主題的通知"],"You will receive notifications for any activity":["接收所有活動的通知"],"You will receive notifications only for comments in which you were @mentioned":["只接收評論中提及(@)您的通知"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["在賬號上 %{set_password_link} 之前將無法通過 %{protocol} 拉取或推送代碼。"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["在賬號中 %{add_ssh_key_link} 之前將無法通過 SSH 拉取或推送代碼。"],"Your name":["您的名字"],"day":["天"],"notification emails":["通知郵件"],"parent":["父級"],"pipeline schedules documentation":["流水線計劃文檔"],"with stage":["於階段"]}}}; \ No newline at end of file +var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-15 06:23-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"%{commit_author_link} committed %{commit_timeago}":["由 %{commit_author_link} 提交於 %{commit_timeago}"],"About auto deploy":["關於自動部署"],"Active":["啟用"],"Activity":["活動"],"Add Changelog":["添加更新日誌"],"Add Contribution guide":["添加貢獻指南"],"Add License":["添加許可證"],"Add an SSH key to your profile to pull or push via SSH.":["新增壹個用於推送或拉取的 SSH 秘鑰到賬號中。"],"Add new directory":["添加新目錄"],"Archived project! Repository is read-only":["歸檔項目!存儲庫為只讀"],"Are you sure you want to delete this pipeline schedule?":["確定要刪除此流水線計劃嗎?"],"Attach a file by drag & drop or %{upload_link}":["拖放文件到此處或者 %{upload_link}"],"Branch":["分支"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["分支 %{branch_name} 已創建。如需設置自動部署, 請選擇合適的 GitLab CI Yaml 模板併提交更改。%{link_to_autodeploy_doc}"],"Branches":["分支"],"Browse files":["瀏覽文件"],"ByAuthor|by":["作者:"],"CI configuration":["CI 配置"],"Cancel":["取消"],"ChangeTypeActionLabel|Pick into branch":["挑選到分支"],"ChangeTypeActionLabel|Revert in branch":["還原分支"],"ChangeTypeAction|Cherry-pick":["優選"],"ChangeType|commit":["提交"],"ChangeType|merge request":["合併請求"],"Changelog":["更新日誌"],"Charts":["統計圖"],"Cherry-pick this commit":["優選此提交"],"Cherry-pick this merge-request":["優選此合併請求"],"CiStatusLabel|canceled":["已取消"],"CiStatusLabel|created":["已創建"],"CiStatusLabel|failed":["已失敗"],"CiStatusLabel|manual action":["手動操作"],"CiStatusLabel|passed":["已通過"],"CiStatusLabel|passed with warnings":["已通過但有警告"],"CiStatusLabel|pending":["等待中"],"CiStatusLabel|skipped":["已跳過"],"CiStatusLabel|waiting for manual action":["等待手動操作"],"CiStatusText|blocked":["已阻塞"],"CiStatusText|canceled":["已取消"],"CiStatusText|created":["已創建"],"CiStatusText|failed":["已失敗"],"CiStatusText|manual":["待手動"],"CiStatusText|passed":["已通過"],"CiStatusText|pending":["等待中"],"CiStatusText|skipped":["已跳過"],"CiStatus|running":["運行中"],"Commit":["提交"],"Commit message":["提交信息"],"CommitMessage|Add %{file_name}":["添加 %{file_name}"],"Commits":["提交"],"Commits|History":["歷史"],"Committed by":["提交於"],"Compare":["比較"],"Contribution guide":["貢獻指南"],"Contributors":["貢獻者"],"Copy URL to clipboard":["複製URL到剪貼板"],"Copy commit SHA to clipboard":["複製提交 SHA 到剪貼板"],"Create New Directory":["創建新目錄"],"Create directory":["創建目錄"],"Create empty bare repository":["創建空的存儲庫"],"Create merge request":["創建合併請求"],"Create new...":["創建..."],"CreateNewFork|Fork":["派生"],"CreateTag|Tag":["標籤"],"Cron Timezone":["Cron 時區"],"Cron syntax":["Cron 語法"],"Custom":["自定義"],"Custom notification events":["自定義通知事件"],"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}.":["自定義通知級別繼承自參與級別。使用自定義通知級別,您會收到參與級別及選定事件的通知。想了解更多信息,請查看 %{notification_link}."],"Cycle Analytics":["週期分析"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Define a custom pattern with cron syntax":["使用 Cron 語法定義自定義模式"],"Delete":["刪除"],"Deploy":["部署"],"Description":["描述"],"Directory name":["目錄名稱"],"Don't show again":["不再顯示"],"Download":["下載"],"Download tar":["下載 tar"],"Download tar.bz2":["下載 tar.bz2"],"Download tar.gz":["下載 tar.gz"],"Download zip":["下載 zip"],"DownloadArtifacts|Download":["下載"],"DownloadCommit|Email Patches":["電子郵件補丁"],"DownloadCommit|Plain Diff":["Diff 文件"],"DownloadSource|Download":["下載"],"Edit":["編輯"],"Edit Pipeline Schedule %{id}":["編輯 %{id} 流水線計劃"],"Every day (at 4:00am)":["每日執行(淩晨4點)"],"Every month (on the 1st at 4:00am)":["每月執行(每月1日淩晨4點)"],"Every week (Sundays at 4:00am)":["每週執行(周日淩晨4點)"],"Failed to change the owner":["無法變更所有者"],"Failed to remove the pipeline schedule":["無法刪除流水線計劃"],"Files":["文件"],"Find by path":["按路徑查找"],"Find file":["查找文件"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"Fork":["派生"],"ForkedFromProjectPath|Forked from":["派生自"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Go to your fork":["跳轉到派生項目"],"GoToYourFork|Fork":["跳轉到派生項目"],"Home":["首頁"],"Housekeeping successfully started":["已開始維護"],"Import repository":["導入存儲庫"],"Interval Pattern":["重複週期"],"Introducing Cycle Analytics":["週期分析簡介"],"LFSStatus|Disabled":["停用"],"LFSStatus|Enabled":["啟用"],"Last %d day":["最近 %d 天"],"Last Pipeline":["最新流水線"],"Last Update":["最後更新"],"Last commit":["最後提交"],"Learn more in the":["了解更多"],"Leave group":["退出群組"],"Leave project":["退出項目"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"MissingSSHKeyWarningLink|add an SSH key":["添加壹個 SSH 公鑰"],"New Issue":["新建議題"],"New Pipeline Schedule":["創建流水線計劃"],"New branch":["新增分支"],"New directory":["新增目錄"],"New file":["新增文件"],"New issue":["新議題"],"New merge request":["新增合併請求"],"New schedule":["新增计划"],"New snippet":["新代碼片段"],"New tag":["新增標籤"],"No repository":["沒有存儲庫"],"No schedules":["沒有計劃"],"Not available":["不可用"],"Not enough data":["數據不足"],"Notification events":["通知事件"],"NotificationEvent|Close issue":["關閉議題"],"NotificationEvent|Close merge request":["關閉合併請求"],"NotificationEvent|Failed pipeline":["流水線失敗"],"NotificationEvent|Merge merge request":["合併請求被合併"],"NotificationEvent|New issue":["新增議題"],"NotificationEvent|New merge request":["新合併請求"],"NotificationEvent|New note":["新增評論"],"NotificationEvent|Reassign issue":["重新指派議題"],"NotificationEvent|Reassign merge request":["重新指派合併請求"],"NotificationEvent|Reopen issue":["重新打開議題"],"NotificationEvent|Successful pipeline":["流水線成功完成"],"NotificationLevel|Custom":["自定義"],"NotificationLevel|Disabled":["停用"],"NotificationLevel|Global":["全局"],"NotificationLevel|On mention":["提及"],"NotificationLevel|Participate":["參與"],"NotificationLevel|Watch":["關注"],"OfSearchInADropdown|Filter":["篩選"],"OpenedNDaysAgo|Opened":["開始於"],"Options":["操作"],"Owner":["所有者"],"Pipeline":["流水線"],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":["流水線計劃"],"Pipeline Schedules":["流水線計劃"],"PipelineSchedules|Activated":["是否啟用"],"PipelineSchedules|Active":["已啟用"],"PipelineSchedules|All":["所有"],"PipelineSchedules|Inactive":["未啟用"],"PipelineSchedules|Next Run":["下次運行時間"],"PipelineSchedules|None":["無"],"PipelineSchedules|Provide a short description for this pipeline":["為此流水線提供簡短描述"],"PipelineSchedules|Take ownership":["取得所有者"],"PipelineSchedules|Target":["目標"],"Project '%{project_name}' queued for deletion.":["項目 '%{project_name}' 已進入刪除隊列。"],"Project '%{project_name}' was successfully created.":["項目 '%{project_name}' 已創建成功。"],"Project '%{project_name}' was successfully updated.":["項目 '%{project_name}' 已更新完成。"],"Project '%{project_name}' will be deleted.":["項目 '%{project_name}' 將被刪除。"],"Project access must be granted explicitly to each user.":["項目訪問權限必須明確授權給每個用戶。"],"Project export could not be deleted.":["無法刪除項目導出。"],"Project export has been deleted.":["項目導出已被刪除。"],"Project export link has expired. Please generate a new export from your project settings.":["項目導出鏈接已過期。請從項目設置中重新生成項目導出。"],"Project export started. A download link will be sent by email.":["項目導出已開始。下載鏈接將通過電子郵件發送。"],"Project home":["項目首頁"],"ProjectFeature|Disabled":["停用"],"ProjectFeature|Everyone with access":["任何人都可訪問"],"ProjectFeature|Only team members":["只限團隊成員"],"ProjectFileTree|Name":["名稱"],"ProjectLastActivity|Never":["從未"],"ProjectLifecycle|Stage":["階段"],"ProjectNetworkGraph|Graph":["分支圖"],"Read more":["了解更多"],"Readme":["自述文件"],"RefSwitcher|Branches":["分支"],"RefSwitcher|Tags":["標籤"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合併請求"],"Remind later":["稍後提醒"],"Remove project":["刪除項目"],"Request Access":["申請訪問"],"Revert this commit":["還原此提交"],"Revert this merge-request":["還原此合併請求"],"Save pipeline schedule":["保存流水線計劃"],"Schedule a new pipeline":["新建流水線計劃"],"Scheduling Pipelines":["流水線計劃"],"Search branches and tags":["搜索分支和標籤"],"Select Archive Format":["選擇下載格式"],"Select a timezone":["選擇時區"],"Select target branch":["選擇目標分支"],"Set a password on your account to pull or push via %{protocol}":["為賬號添加壹個用於推送或拉取的 %{protocol} 密碼。"],"Set up CI":["設置 CI"],"Set up Koding":["設置 Koding"],"Set up auto deploy":["設置自動部署"],"SetPasswordToCloneLink|set a password":["設置密碼"],"Showing %d event":["顯示 %d 個事件"],"Source code":["源代碼"],"StarProject|Star":["星標"],"Start a new merge request with these changes":["由此更改創建新合併請求"],"Switch branch/tag":["切換分支/標籤"],"Tag":["標籤"],"Tags":["標籤"],"Target Branch":["目標分支"],"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.":["編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"The fork relationship has been removed.":["派生關係已被刪除。"],"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.":["議題階段概述了從創建議題到將議題添加到裏程碑或議題看板的時間。創建第壹個議題後,數據將自動添加到此處.。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["流水線計劃會週期性重複運行指定分支或標籤的流水線。這些流水線將根據其關聯用戶繼承有限的項目訪問權限。"],"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.":["計劃階段概述了從議題添加到日程到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"The project can be accessed by any logged in user.":["該項目允許已登錄的用戶訪問。"],"The project can be accessed without any authentication.":["該項目允許任何人訪問。"],"The repository for this project does not exist.":["此項目的存儲庫不存在。"],"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.":["評審階段概述了從創建合併請求到合併的時間。當創建第壹個合併請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"This means you can not push code until you create an empty repository or import existing one.":["在創建壹個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合併或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Timeago|%s days ago":["%s 天前"],"Timeago|%s days remaining":["剩餘 %s 天"],"Timeago|%s hours remaining":["剩餘 %s 小時"],"Timeago|%s minutes ago":["%s 分鐘前"],"Timeago|%s minutes remaining":["剩餘 %s 分鐘"],"Timeago|%s months ago":["%s 個月前"],"Timeago|%s months remaining":["剩餘 %s 月"],"Timeago|%s seconds remaining":["剩餘 %s 秒"],"Timeago|%s weeks ago":["%s 星期前"],"Timeago|%s weeks remaining":["剩餘 %s 星期"],"Timeago|%s years ago":["%s 年前"],"Timeago|%s years remaining":["剩餘 %s 年"],"Timeago|1 day remaining":["剩餘 1 天"],"Timeago|1 hour remaining":["剩餘 1 小時"],"Timeago|1 minute remaining":["剩餘 1 分鐘"],"Timeago|1 month remaining":["剩餘 1 個月"],"Timeago|1 week remaining":["剩餘 1 星期"],"Timeago|1 year remaining":["剩餘 1 年"],"Timeago|Past due":["逾期"],"Timeago|a day ago":["1 天前"],"Timeago|a month ago":["1 個月前"],"Timeago|a week ago":["1 星期前"],"Timeago|a while":["剛剛"],"Timeago|a year ago":["1 年前"],"Timeago|about %s hours ago":["約 %s 小時前"],"Timeago|about a minute ago":["約 1 分鐘前"],"Timeago|about an hour ago":["約 1 小時前"],"Timeago|in %s days":[" %s 天後"],"Timeago|in %s hours":[" %s 小時後"],"Timeago|in %s minutes":[" %s 分鐘後"],"Timeago|in %s months":[" %s 個月後"],"Timeago|in %s seconds":[" %s 秒後"],"Timeago|in %s weeks":[" %s 星期後"],"Timeago|in %s years":[" %s 年後"],"Timeago|in 1 day":[" 1 天後"],"Timeago|in 1 hour":[" 1 小時後"],"Timeago|in 1 minute":[" 1 分鐘後"],"Timeago|in 1 month":[" 1 月後"],"Timeago|in 1 week":[" 1 星期後"],"Timeago|in 1 year":[" 1 年後"],"Timeago|less than a minute ago":["不到 1 分鐘前"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Unstar":["取消星標"],"Upload New File":["上傳新文件"],"Upload file":["上傳文件"],"Use your global notification setting":["使用全局通知設置"],"VisibilityLevel|Internal":["內部"],"VisibilityLevel|Private":["私有"],"VisibilityLevel|Public":["公開"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"Withdraw Access Request":["取消訪問請求"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["即將要刪除 %{project_name_with_namespace}。\\n已刪除的項目無法恢複!\\n確定繼續嗎?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["即將刪除與源項目 %{forked_from_project} 的派生關系。確定繼續嗎?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["即將 %{project_name_with_namespace} 轉義給另壹個所有者。確定繼續嗎?"],"You can only add files when you are on a branch":["只能在分支上添加文件"],"You must sign in to star a project":["必須登錄才能對項目加星標"],"You need permission.":["需要相關的權限。"],"You will not get any notifications via email":["不會收到任何通知郵件"],"You will only receive notifications for the events you choose":["只接收您選擇的事件通知"],"You will only receive notifications for threads you have participated in":["只接收您參與的主題的通知"],"You will receive notifications for any activity":["接收所有活動的通知"],"You will receive notifications only for comments in which you were @mentioned":["只接收評論中提及(@)您的通知"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["在賬號上 %{set_password_link} 之前將無法通過 %{protocol} 拉取或推送代碼。"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["在賬號中 %{add_ssh_key_link} 之前將無法通過 SSH 拉取或推送代碼。"],"Your name":["您的名字"],"day":["天"],"notification emails":["通知郵件"],"parent":["父級"],"pipeline schedules documentation":["流水線計劃文檔"],"with stage":["於階段"]}}}; \ No newline at end of file diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po index 0be8887cc61..fc5feb0ab2c 100644 --- a/locale/zh_HK/gitlab.po +++ b/locale/zh_HK/gitlab.po @@ -7,7 +7,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-14 05:43-0400\n" +"PO-Revision-Date: 2017-06-15 06:23-0400\n" "Last-Translator: Huang Tao \n" "Language-Team: Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)\n" "Language: zh-HK\n" @@ -211,7 +211,7 @@ msgid "CreateNewFork|Fork" msgstr "派生" msgid "CreateTag|Tag" -msgstr "標簽" +msgstr "標籤" msgid "Cron Timezone" msgstr "Cron 時區" @@ -317,7 +317,7 @@ msgid "Every day (at 4:00am)" msgstr "每日執行(淩晨4點)" msgid "Every month (on the 1st at 4:00am)" -msgstr "每月执行(第一天淩晨4點)" +msgstr "每月執行(每月1日淩晨4點)" msgid "Every week (Sundays at 4:00am)" msgstr "每週執行(周日淩晨4點)" @@ -372,7 +372,7 @@ msgid "Import repository" msgstr "導入存儲庫" msgid "Interval Pattern" -msgstr "重復週期" +msgstr "重複週期" msgid "Introducing Cycle Analytics" msgstr "週期分析簡介" @@ -417,7 +417,7 @@ msgstr "添加壹個 SSH 公鑰" msgid "New Issue" msgid_plural "New Issues" -msgstr[0] "新增議題" +msgstr[0] "新建議題" msgid "New Pipeline Schedule" msgstr "創建流水線計劃" @@ -519,7 +519,7 @@ msgid "OpenedNDaysAgo|Opened" msgstr "開始於" msgid "Options" -msgstr "選項" +msgstr "操作" msgid "Owner" msgstr "所有者" @@ -582,7 +582,7 @@ msgid "Project export could not be deleted." msgstr "無法刪除項目導出。" msgid "Project export has been deleted." -msgstr "項目導出已刪除。" +msgstr "項目導出已被刪除。" msgid "" "Project export link has expired. Please generate a new export from your " @@ -602,7 +602,7 @@ msgid "ProjectFeature|Everyone with access" msgstr "任何人都可訪問" msgid "ProjectFeature|Only team members" -msgstr "只有團隊成員" +msgstr "只限團隊成員" msgid "ProjectFileTree|Name" msgstr "名稱" @@ -748,7 +748,7 @@ 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 "流水線計劃會週期性重復運行指定分支或標簽的流水線。這些流水線將根據其關聯用戶繼承有限的項目訪問權限。" +msgstr "流水線計劃會週期性重複運行指定分支或標籤的流水線。這些流水線將根據其關聯用戶繼承有限的項目訪問權限。" msgid "" "The planning stage shows the time from the previous step to pushing your " @@ -990,7 +990,7 @@ msgid "" "Removed project CANNOT be restored!\n" "Are you ABSOLUTELY sure?" msgstr "即將要刪除 %{project_name_with_namespace}。\n" -"已刪除的項目無法恢復!\n" +"已刪除的項目無法恢複!\n" "確定繼續嗎?" msgid "" From a62bead807a0d44bcdf30324cbd293b4f5af03af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B6=9B?= Date: Fri, 16 Jun 2017 10:53:47 +0800 Subject: [PATCH 0082/1380] add missing translation fields 1. Follow up !12052 commits. --- app/assets/javascripts/locale/zh_HK/app.js | 2 +- locale/zh_HK/gitlab.po | 46 +++++++++++++--------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/app/assets/javascripts/locale/zh_HK/app.js b/app/assets/javascripts/locale/zh_HK/app.js index b22262bb24d..c87cab5423f 100644 --- a/app/assets/javascripts/locale/zh_HK/app.js +++ b/app/assets/javascripts/locale/zh_HK/app.js @@ -1 +1 @@ -var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-12 19:29-0500","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-15 06:23-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"%{commit_author_link} committed %{commit_timeago}":["由 %{commit_author_link} 提交於 %{commit_timeago}"],"About auto deploy":["關於自動部署"],"Active":["啟用"],"Activity":["活動"],"Add Changelog":["添加更新日誌"],"Add Contribution guide":["添加貢獻指南"],"Add License":["添加許可證"],"Add an SSH key to your profile to pull or push via SSH.":["新增壹個用於推送或拉取的 SSH 秘鑰到賬號中。"],"Add new directory":["添加新目錄"],"Archived project! Repository is read-only":["歸檔項目!存儲庫為只讀"],"Are you sure you want to delete this pipeline schedule?":["確定要刪除此流水線計劃嗎?"],"Attach a file by drag & drop or %{upload_link}":["拖放文件到此處或者 %{upload_link}"],"Branch":["分支"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["分支 %{branch_name} 已創建。如需設置自動部署, 請選擇合適的 GitLab CI Yaml 模板併提交更改。%{link_to_autodeploy_doc}"],"Branches":["分支"],"Browse files":["瀏覽文件"],"ByAuthor|by":["作者:"],"CI configuration":["CI 配置"],"Cancel":["取消"],"ChangeTypeActionLabel|Pick into branch":["挑選到分支"],"ChangeTypeActionLabel|Revert in branch":["還原分支"],"ChangeTypeAction|Cherry-pick":["優選"],"ChangeType|commit":["提交"],"ChangeType|merge request":["合併請求"],"Changelog":["更新日誌"],"Charts":["統計圖"],"Cherry-pick this commit":["優選此提交"],"Cherry-pick this merge-request":["優選此合併請求"],"CiStatusLabel|canceled":["已取消"],"CiStatusLabel|created":["已創建"],"CiStatusLabel|failed":["已失敗"],"CiStatusLabel|manual action":["手動操作"],"CiStatusLabel|passed":["已通過"],"CiStatusLabel|passed with warnings":["已通過但有警告"],"CiStatusLabel|pending":["等待中"],"CiStatusLabel|skipped":["已跳過"],"CiStatusLabel|waiting for manual action":["等待手動操作"],"CiStatusText|blocked":["已阻塞"],"CiStatusText|canceled":["已取消"],"CiStatusText|created":["已創建"],"CiStatusText|failed":["已失敗"],"CiStatusText|manual":["待手動"],"CiStatusText|passed":["已通過"],"CiStatusText|pending":["等待中"],"CiStatusText|skipped":["已跳過"],"CiStatus|running":["運行中"],"Commit":["提交"],"Commit message":["提交信息"],"CommitMessage|Add %{file_name}":["添加 %{file_name}"],"Commits":["提交"],"Commits|History":["歷史"],"Committed by":["提交於"],"Compare":["比較"],"Contribution guide":["貢獻指南"],"Contributors":["貢獻者"],"Copy URL to clipboard":["複製URL到剪貼板"],"Copy commit SHA to clipboard":["複製提交 SHA 到剪貼板"],"Create New Directory":["創建新目錄"],"Create directory":["創建目錄"],"Create empty bare repository":["創建空的存儲庫"],"Create merge request":["創建合併請求"],"Create new...":["創建..."],"CreateNewFork|Fork":["派生"],"CreateTag|Tag":["標籤"],"Cron Timezone":["Cron 時區"],"Cron syntax":["Cron 語法"],"Custom":["自定義"],"Custom notification events":["自定義通知事件"],"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}.":["自定義通知級別繼承自參與級別。使用自定義通知級別,您會收到參與級別及選定事件的通知。想了解更多信息,請查看 %{notification_link}."],"Cycle Analytics":["週期分析"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Define a custom pattern with cron syntax":["使用 Cron 語法定義自定義模式"],"Delete":["刪除"],"Deploy":["部署"],"Description":["描述"],"Directory name":["目錄名稱"],"Don't show again":["不再顯示"],"Download":["下載"],"Download tar":["下載 tar"],"Download tar.bz2":["下載 tar.bz2"],"Download tar.gz":["下載 tar.gz"],"Download zip":["下載 zip"],"DownloadArtifacts|Download":["下載"],"DownloadCommit|Email Patches":["電子郵件補丁"],"DownloadCommit|Plain Diff":["Diff 文件"],"DownloadSource|Download":["下載"],"Edit":["編輯"],"Edit Pipeline Schedule %{id}":["編輯 %{id} 流水線計劃"],"Every day (at 4:00am)":["每日執行(淩晨4點)"],"Every month (on the 1st at 4:00am)":["每月執行(每月1日淩晨4點)"],"Every week (Sundays at 4:00am)":["每週執行(周日淩晨4點)"],"Failed to change the owner":["無法變更所有者"],"Failed to remove the pipeline schedule":["無法刪除流水線計劃"],"Files":["文件"],"Find by path":["按路徑查找"],"Find file":["查找文件"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"Fork":["派生"],"ForkedFromProjectPath|Forked from":["派生自"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Go to your fork":["跳轉到派生項目"],"GoToYourFork|Fork":["跳轉到派生項目"],"Home":["首頁"],"Housekeeping successfully started":["已開始維護"],"Import repository":["導入存儲庫"],"Interval Pattern":["重複週期"],"Introducing Cycle Analytics":["週期分析簡介"],"LFSStatus|Disabled":["停用"],"LFSStatus|Enabled":["啟用"],"Last %d day":["最近 %d 天"],"Last Pipeline":["最新流水線"],"Last Update":["最後更新"],"Last commit":["最後提交"],"Learn more in the":["了解更多"],"Leave group":["退出群組"],"Leave project":["退出項目"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"MissingSSHKeyWarningLink|add an SSH key":["添加壹個 SSH 公鑰"],"New Issue":["新建議題"],"New Pipeline Schedule":["創建流水線計劃"],"New branch":["新增分支"],"New directory":["新增目錄"],"New file":["新增文件"],"New issue":["新議題"],"New merge request":["新增合併請求"],"New schedule":["新增计划"],"New snippet":["新代碼片段"],"New tag":["新增標籤"],"No repository":["沒有存儲庫"],"No schedules":["沒有計劃"],"Not available":["不可用"],"Not enough data":["數據不足"],"Notification events":["通知事件"],"NotificationEvent|Close issue":["關閉議題"],"NotificationEvent|Close merge request":["關閉合併請求"],"NotificationEvent|Failed pipeline":["流水線失敗"],"NotificationEvent|Merge merge request":["合併請求被合併"],"NotificationEvent|New issue":["新增議題"],"NotificationEvent|New merge request":["新合併請求"],"NotificationEvent|New note":["新增評論"],"NotificationEvent|Reassign issue":["重新指派議題"],"NotificationEvent|Reassign merge request":["重新指派合併請求"],"NotificationEvent|Reopen issue":["重新打開議題"],"NotificationEvent|Successful pipeline":["流水線成功完成"],"NotificationLevel|Custom":["自定義"],"NotificationLevel|Disabled":["停用"],"NotificationLevel|Global":["全局"],"NotificationLevel|On mention":["提及"],"NotificationLevel|Participate":["參與"],"NotificationLevel|Watch":["關注"],"OfSearchInADropdown|Filter":["篩選"],"OpenedNDaysAgo|Opened":["開始於"],"Options":["操作"],"Owner":["所有者"],"Pipeline":["流水線"],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":["流水線計劃"],"Pipeline Schedules":["流水線計劃"],"PipelineSchedules|Activated":["是否啟用"],"PipelineSchedules|Active":["已啟用"],"PipelineSchedules|All":["所有"],"PipelineSchedules|Inactive":["未啟用"],"PipelineSchedules|Next Run":["下次運行時間"],"PipelineSchedules|None":["無"],"PipelineSchedules|Provide a short description for this pipeline":["為此流水線提供簡短描述"],"PipelineSchedules|Take ownership":["取得所有者"],"PipelineSchedules|Target":["目標"],"Project '%{project_name}' queued for deletion.":["項目 '%{project_name}' 已進入刪除隊列。"],"Project '%{project_name}' was successfully created.":["項目 '%{project_name}' 已創建成功。"],"Project '%{project_name}' was successfully updated.":["項目 '%{project_name}' 已更新完成。"],"Project '%{project_name}' will be deleted.":["項目 '%{project_name}' 將被刪除。"],"Project access must be granted explicitly to each user.":["項目訪問權限必須明確授權給每個用戶。"],"Project export could not be deleted.":["無法刪除項目導出。"],"Project export has been deleted.":["項目導出已被刪除。"],"Project export link has expired. Please generate a new export from your project settings.":["項目導出鏈接已過期。請從項目設置中重新生成項目導出。"],"Project export started. A download link will be sent by email.":["項目導出已開始。下載鏈接將通過電子郵件發送。"],"Project home":["項目首頁"],"ProjectFeature|Disabled":["停用"],"ProjectFeature|Everyone with access":["任何人都可訪問"],"ProjectFeature|Only team members":["只限團隊成員"],"ProjectFileTree|Name":["名稱"],"ProjectLastActivity|Never":["從未"],"ProjectLifecycle|Stage":["階段"],"ProjectNetworkGraph|Graph":["分支圖"],"Read more":["了解更多"],"Readme":["自述文件"],"RefSwitcher|Branches":["分支"],"RefSwitcher|Tags":["標籤"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合併請求"],"Remind later":["稍後提醒"],"Remove project":["刪除項目"],"Request Access":["申請訪問"],"Revert this commit":["還原此提交"],"Revert this merge-request":["還原此合併請求"],"Save pipeline schedule":["保存流水線計劃"],"Schedule a new pipeline":["新建流水線計劃"],"Scheduling Pipelines":["流水線計劃"],"Search branches and tags":["搜索分支和標籤"],"Select Archive Format":["選擇下載格式"],"Select a timezone":["選擇時區"],"Select target branch":["選擇目標分支"],"Set a password on your account to pull or push via %{protocol}":["為賬號添加壹個用於推送或拉取的 %{protocol} 密碼。"],"Set up CI":["設置 CI"],"Set up Koding":["設置 Koding"],"Set up auto deploy":["設置自動部署"],"SetPasswordToCloneLink|set a password":["設置密碼"],"Showing %d event":["顯示 %d 個事件"],"Source code":["源代碼"],"StarProject|Star":["星標"],"Start a new merge request with these changes":["由此更改創建新合併請求"],"Switch branch/tag":["切換分支/標籤"],"Tag":["標籤"],"Tags":["標籤"],"Target Branch":["目標分支"],"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.":["編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"The fork relationship has been removed.":["派生關係已被刪除。"],"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.":["議題階段概述了從創建議題到將議題添加到裏程碑或議題看板的時間。創建第壹個議題後,數據將自動添加到此處.。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["流水線計劃會週期性重複運行指定分支或標籤的流水線。這些流水線將根據其關聯用戶繼承有限的項目訪問權限。"],"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.":["計劃階段概述了從議題添加到日程到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"The project can be accessed by any logged in user.":["該項目允許已登錄的用戶訪問。"],"The project can be accessed without any authentication.":["該項目允許任何人訪問。"],"The repository for this project does not exist.":["此項目的存儲庫不存在。"],"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.":["評審階段概述了從創建合併請求到合併的時間。當創建第壹個合併請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"This means you can not push code until you create an empty repository or import existing one.":["在創建壹個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合併或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Timeago|%s days ago":["%s 天前"],"Timeago|%s days remaining":["剩餘 %s 天"],"Timeago|%s hours remaining":["剩餘 %s 小時"],"Timeago|%s minutes ago":["%s 分鐘前"],"Timeago|%s minutes remaining":["剩餘 %s 分鐘"],"Timeago|%s months ago":["%s 個月前"],"Timeago|%s months remaining":["剩餘 %s 月"],"Timeago|%s seconds remaining":["剩餘 %s 秒"],"Timeago|%s weeks ago":["%s 星期前"],"Timeago|%s weeks remaining":["剩餘 %s 星期"],"Timeago|%s years ago":["%s 年前"],"Timeago|%s years remaining":["剩餘 %s 年"],"Timeago|1 day remaining":["剩餘 1 天"],"Timeago|1 hour remaining":["剩餘 1 小時"],"Timeago|1 minute remaining":["剩餘 1 分鐘"],"Timeago|1 month remaining":["剩餘 1 個月"],"Timeago|1 week remaining":["剩餘 1 星期"],"Timeago|1 year remaining":["剩餘 1 年"],"Timeago|Past due":["逾期"],"Timeago|a day ago":["1 天前"],"Timeago|a month ago":["1 個月前"],"Timeago|a week ago":["1 星期前"],"Timeago|a while":["剛剛"],"Timeago|a year ago":["1 年前"],"Timeago|about %s hours ago":["約 %s 小時前"],"Timeago|about a minute ago":["約 1 分鐘前"],"Timeago|about an hour ago":["約 1 小時前"],"Timeago|in %s days":[" %s 天後"],"Timeago|in %s hours":[" %s 小時後"],"Timeago|in %s minutes":[" %s 分鐘後"],"Timeago|in %s months":[" %s 個月後"],"Timeago|in %s seconds":[" %s 秒後"],"Timeago|in %s weeks":[" %s 星期後"],"Timeago|in %s years":[" %s 年後"],"Timeago|in 1 day":[" 1 天後"],"Timeago|in 1 hour":[" 1 小時後"],"Timeago|in 1 minute":[" 1 分鐘後"],"Timeago|in 1 month":[" 1 月後"],"Timeago|in 1 week":[" 1 星期後"],"Timeago|in 1 year":[" 1 年後"],"Timeago|less than a minute ago":["不到 1 分鐘前"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Unstar":["取消星標"],"Upload New File":["上傳新文件"],"Upload file":["上傳文件"],"Use your global notification setting":["使用全局通知設置"],"VisibilityLevel|Internal":["內部"],"VisibilityLevel|Private":["私有"],"VisibilityLevel|Public":["公開"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"Withdraw Access Request":["取消訪問請求"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["即將要刪除 %{project_name_with_namespace}。\\n已刪除的項目無法恢複!\\n確定繼續嗎?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["即將刪除與源項目 %{forked_from_project} 的派生關系。確定繼續嗎?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["即將 %{project_name_with_namespace} 轉義給另壹個所有者。確定繼續嗎?"],"You can only add files when you are on a branch":["只能在分支上添加文件"],"You must sign in to star a project":["必須登錄才能對項目加星標"],"You need permission.":["需要相關的權限。"],"You will not get any notifications via email":["不會收到任何通知郵件"],"You will only receive notifications for the events you choose":["只接收您選擇的事件通知"],"You will only receive notifications for threads you have participated in":["只接收您參與的主題的通知"],"You will receive notifications for any activity":["接收所有活動的通知"],"You will receive notifications only for comments in which you were @mentioned":["只接收評論中提及(@)您的通知"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["在賬號上 %{set_password_link} 之前將無法通過 %{protocol} 拉取或推送代碼。"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["在賬號中 %{add_ssh_key_link} 之前將無法通過 SSH 拉取或推送代碼。"],"Your name":["您的名字"],"day":["天"],"notification emails":["通知郵件"],"parent":["父級"],"pipeline schedules documentation":["流水線計劃文檔"],"with stage":["於階段"]}}}; \ No newline at end of file +var locales = locales || {}; locales['zh_HK'] = {"domain":"app","locale_data":{"app":{"":{"Project-Id-Version":"gitlab 1.0.0","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2017-06-15 14:57+0200","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","PO-Revision-Date":"2017-06-15 10:34-0400","Last-Translator":"Huang Tao ","Language-Team":"Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)","Language":"zh-HK","Plural-Forms":"nplurals=1; plural=0;","X-Generator":"Zanata 3.9.6","lang":"zh_HK","domain":"app","plural_forms":"nplurals=1; plural=0;"},"%{commit_author_link} committed %{commit_timeago}":["由 %{commit_author_link} 提交於 %{commit_timeago}"],"About auto deploy":["關於自動部署"],"Active":["啟用"],"Activity":["活動"],"Add Changelog":["添加更新日誌"],"Add Contribution guide":["添加貢獻指南"],"Add License":["添加許可證"],"Add an SSH key to your profile to pull or push via SSH.":["新增壹個用於推送或拉取的 SSH 秘鑰到賬號中。"],"Add new directory":["添加新目錄"],"Archived project! Repository is read-only":["歸檔項目!存儲庫為只讀"],"Are you sure you want to delete this pipeline schedule?":["確定要刪除此流水線計劃嗎?"],"Attach a file by drag & drop or %{upload_link}":["拖放文件到此處或者 %{upload_link}"],"Branch":["分支"],"Branch %{branch_name} was created. To set up auto deploy, choose a GitLab CI Yaml template and commit your changes. %{link_to_autodeploy_doc}":["分支 %{branch_name} 已創建。如需設置自動部署, 請選擇合適的 GitLab CI Yaml 模板併提交更改。%{link_to_autodeploy_doc}"],"Branches":["分支"],"Browse files":["瀏覽文件"],"ByAuthor|by":["作者:"],"CI configuration":["CI 配置"],"Cancel":["取消"],"ChangeTypeActionLabel|Pick into branch":["挑選到分支"],"ChangeTypeActionLabel|Revert in branch":["還原分支"],"ChangeTypeAction|Cherry-pick":["優選"],"ChangeTypeAction|Revert":["還原"],"Changelog":["更新日誌"],"Charts":["統計圖"],"Cherry-pick this commit":["優選此提交"],"Cherry-pick this merge request":["優選此合併請求"],"CiStatusLabel|canceled":["已取消"],"CiStatusLabel|created":["已創建"],"CiStatusLabel|failed":["已失敗"],"CiStatusLabel|manual action":["手動操作"],"CiStatusLabel|passed":["已通過"],"CiStatusLabel|passed with warnings":["已通過但有警告"],"CiStatusLabel|pending":["等待中"],"CiStatusLabel|skipped":["已跳過"],"CiStatusLabel|waiting for manual action":["等待手動操作"],"CiStatusText|blocked":["已阻塞"],"CiStatusText|canceled":["已取消"],"CiStatusText|created":["已創建"],"CiStatusText|failed":["已失敗"],"CiStatusText|manual":["待手動"],"CiStatusText|passed":["已通過"],"CiStatusText|pending":["等待中"],"CiStatusText|skipped":["已跳過"],"CiStatus|running":["運行中"],"Commit":["提交"],"Commit message":["提交信息"],"CommitBoxTitle|Commit":["提交"],"CommitMessage|Add %{file_name}":["添加 %{file_name}"],"Commits":["提交"],"Commits|History":["歷史"],"Committed by":["提交於"],"Compare":["比較"],"Contribution guide":["貢獻指南"],"Contributors":["貢獻者"],"Copy URL to clipboard":["複製URL到剪貼板"],"Copy commit SHA to clipboard":["複製提交 SHA 到剪貼板"],"Create New Directory":["創建新目錄"],"Create directory":["創建目錄"],"Create empty bare repository":["創建空的存儲庫"],"Create merge request":["創建合併請求"],"Create new...":["創建..."],"CreateNewFork|Fork":["派生"],"CreateTag|Tag":["標籤"],"Cron Timezone":["Cron 時區"],"Cron syntax":["Cron 語法"],"Custom notification events":["自定義通知事件"],"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}.":["自定義通知級別繼承自參與級別。使用自定義通知級別,您會收到參與級別及選定事件的通知。想了解更多信息,請查看 %{notification_link}."],"Cycle Analytics":["週期分析"],"Cycle Analytics gives an overview of how much time it takes to go from idea to production in your project.":["週期分析概述了項目從想法到產品實現的各階段所需的時間。"],"CycleAnalyticsStage|Code":["編碼"],"CycleAnalyticsStage|Issue":["議題"],"CycleAnalyticsStage|Plan":["計劃"],"CycleAnalyticsStage|Production":["生產"],"CycleAnalyticsStage|Review":["評審"],"CycleAnalyticsStage|Staging":["預發布"],"CycleAnalyticsStage|Test":["測試"],"Define a custom pattern with cron syntax":["使用 Cron 語法定義自定義模式"],"Delete":["刪除"],"Deploy":["部署"],"Description":["描述"],"Directory name":["目錄名稱"],"Don't show again":["不再顯示"],"Download":["下載"],"Download tar":["下載 tar"],"Download tar.bz2":["下載 tar.bz2"],"Download tar.gz":["下載 tar.gz"],"Download zip":["下載 zip"],"DownloadArtifacts|Download":["下載"],"DownloadCommit|Email Patches":["電子郵件補丁"],"DownloadCommit|Plain Diff":["Diff 文件"],"DownloadSource|Download":["下載"],"Edit":["編輯"],"Edit Pipeline Schedule %{id}":["編輯 %{id} 流水線計劃"],"Every day (at 4:00am)":["每日執行(淩晨4點)"],"Every month (on the 1st at 4:00am)":["每月執行(每月1日淩晨4點)"],"Every week (Sundays at 4:00am)":["每週執行(周日淩晨4點)"],"Failed to change the owner":["無法變更所有者"],"Failed to remove the pipeline schedule":["無法刪除流水線計劃"],"Files":["文件"],"Find by path":["按路徑查找"],"Find file":["查找文件"],"FirstPushedBy|First":["首次推送"],"FirstPushedBy|pushed by":["推送者:"],"Fork":["派生"],"ForkedFromProjectPath|Forked from":["派生自"],"From issue creation until deploy to production":["從創建議題到部署到生產環境"],"From merge request merge until deploy to production":["從合併請求的合併到部署至生產環境"],"Go to your fork":["跳轉到派生項目"],"GoToYourFork|Fork":["跳轉到派生項目"],"Home":["首頁"],"Housekeeping successfully started":["已開始維護"],"Import repository":["導入存儲庫"],"Interval Pattern":["重複週期"],"Introducing Cycle Analytics":["週期分析簡介"],"LFSStatus|Disabled":["停用"],"LFSStatus|Enabled":["啟用"],"Last %d day":["最近 %d 天"],"Last Pipeline":["最新流水線"],"Last Update":["最後更新"],"Last commit":["最後提交"],"Learn more in the":["了解更多"],"Learn more in the|pipeline schedules documentation":["流水線計劃文檔"],"Leave group":["退出群組"],"Leave project":["退出項目"],"Limited to showing %d event at most":["最多顯示 %d 個事件"],"Median":["中位數"],"MissingSSHKeyWarningLink|add an SSH key":["添加壹個 SSH 公鑰"],"New Issue":["新建議題"],"New Pipeline Schedule":["創建流水線計劃"],"New branch":["新增分支"],"New directory":["新增目錄"],"New file":["新增文件"],"New issue":["新議題"],"New merge request":["新增合併請求"],"New schedule":["新增计划"],"New snippet":["新代碼片段"],"New tag":["新增標籤"],"No repository":["沒有存儲庫"],"No schedules":["沒有計劃"],"Not available":["不可用"],"Not enough data":["數據不足"],"Notification events":["通知事件"],"NotificationEvent|Close issue":["關閉議題"],"NotificationEvent|Close merge request":["關閉合併請求"],"NotificationEvent|Failed pipeline":["流水線失敗"],"NotificationEvent|Merge merge request":["合併請求被合併"],"NotificationEvent|New issue":["新增議題"],"NotificationEvent|New merge request":["新合併請求"],"NotificationEvent|New note":["新增評論"],"NotificationEvent|Reassign issue":["重新指派議題"],"NotificationEvent|Reassign merge request":["重新指派合併請求"],"NotificationEvent|Reopen issue":["重新打開議題"],"NotificationEvent|Successful pipeline":["流水線成功完成"],"NotificationLevel|Custom":["自定義"],"NotificationLevel|Disabled":["停用"],"NotificationLevel|Global":["全局"],"NotificationLevel|On mention":["提及"],"NotificationLevel|Participate":["參與"],"NotificationLevel|Watch":["關注"],"OfSearchInADropdown|Filter":["篩選"],"OpenedNDaysAgo|Opened":["開始於"],"Options":["操作"],"Owner":["所有者"],"Pipeline":["流水線"],"Pipeline Health":["流水線健康指標"],"Pipeline Schedule":["流水線計劃"],"Pipeline Schedules":["流水線計劃"],"PipelineSchedules|Activated":["是否啟用"],"PipelineSchedules|Active":["已啟用"],"PipelineSchedules|All":["所有"],"PipelineSchedules|Inactive":["未啟用"],"PipelineSchedules|Next Run":["下次運行時間"],"PipelineSchedules|None":["無"],"PipelineSchedules|Provide a short description for this pipeline":["為此流水線提供簡短描述"],"PipelineSchedules|Take ownership":["取得所有者"],"PipelineSchedules|Target":["目標"],"PipelineSheduleIntervalPattern|Custom":["自定義"],"Pipeline|with stage":["於階段"],"Pipeline|with stages":["於階段"],"Project '%{project_name}' queued for deletion.":["項目 '%{project_name}' 已進入刪除隊列。"],"Project '%{project_name}' was successfully created.":["項目 '%{project_name}' 已創建成功。"],"Project '%{project_name}' was successfully updated.":["項目 '%{project_name}' 已更新完成。"],"Project '%{project_name}' will be deleted.":["項目 '%{project_name}' 將被刪除。"],"Project access must be granted explicitly to each user.":["項目訪問權限必須明確授權給每個用戶。"],"Project export could not be deleted.":["無法刪除項目導出。"],"Project export has been deleted.":["項目導出已被刪除。"],"Project export link has expired. Please generate a new export from your project settings.":["項目導出鏈接已過期。請從項目設置中重新生成項目導出。"],"Project export started. A download link will be sent by email.":["項目導出已開始。下載鏈接將通過電子郵件發送。"],"Project home":["項目首頁"],"ProjectFeature|Disabled":["停用"],"ProjectFeature|Everyone with access":["任何人都可訪問"],"ProjectFeature|Only team members":["只限團隊成員"],"ProjectFileTree|Name":["名稱"],"ProjectLastActivity|Never":["從未"],"ProjectLifecycle|Stage":["階段"],"ProjectNetworkGraph|Graph":["分支圖"],"Read more":["了解更多"],"Readme":["自述文件"],"RefSwitcher|Branches":["分支"],"RefSwitcher|Tags":["標籤"],"Related Commits":["相關的提交"],"Related Deployed Jobs":["相關的部署作業"],"Related Issues":["相關的議題"],"Related Jobs":["相關的作業"],"Related Merge Requests":["相關的合併請求"],"Related Merged Requests":["相關已合併的合併請求"],"Remind later":["稍後提醒"],"Remove project":["刪除項目"],"Request Access":["申請訪問"],"Revert this commit":["還原此提交"],"Revert this merge request":["還原此合併請求"],"Save pipeline schedule":["保存流水線計劃"],"Schedule a new pipeline":["新建流水線計劃"],"Scheduling Pipelines":["流水線計劃"],"Search branches and tags":["搜索分支和標籤"],"Select Archive Format":["選擇下載格式"],"Select a timezone":["選擇時區"],"Select target branch":["選擇目標分支"],"Set a password on your account to pull or push via %{protocol}":["為賬號添加壹個用於推送或拉取的 %{protocol} 密碼。"],"Set up CI":["設置 CI"],"Set up Koding":["設置 Koding"],"Set up auto deploy":["設置自動部署"],"SetPasswordToCloneLink|set a password":["設置密碼"],"Showing %d event":["顯示 %d 個事件"],"Source code":["源代碼"],"StarProject|Star":["星標"],"Start a %{new_merge_request} with these changes":["由此更改 %{new_merge_request}"],"Start a new merge request with these changes":["由此更改創建新合併請求"],"Switch branch/tag":["切換分支/標籤"],"Tag":["標籤"],"Tags":["標籤"],"Target Branch":["目標分支"],"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.":["編碼階段概述了從第壹次提交到創建合併請求的時間。創建第壹個合併請求後,數據將自動添加到此處。"],"The collection of events added to the data gathered for that stage.":["與該階段相關的事件。"],"The fork relationship has been removed.":["派生關係已被刪除。"],"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.":["議題階段概述了從創建議題到將議題添加到裏程碑或議題看板的時間。創建第壹個議題後,數據將自動添加到此處.。"],"The phase of the development lifecycle.":["項目生命週期中的各個階段。"],"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.":["流水線計劃會週期性重複運行指定分支或標籤的流水線。這些流水線將根據其關聯用戶繼承有限的項目訪問權限。"],"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.":["計劃階段概述了從議題添加到日程到推送首次提交的時間。當首次推送提交後,數據將自動添加到此處。"],"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.":["生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完成完整的想法到部署生產,數據將自動添加到此處。"],"The project can be accessed by any logged in user.":["該項目允許已登錄的用戶訪問。"],"The project can be accessed without any authentication.":["該項目允許任何人訪問。"],"The repository for this project does not exist.":["此項目的存儲庫不存在。"],"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.":["評審階段概述了從創建合併請求到合併的時間。當創建第壹個合併請求後,數據將自動添加到此處。"],"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.":["預發布階段概述了合併請求的合併到部署代碼到生產環境的總時間。當首次部署到生產環境後,數據將自動添加到此處。"],"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.":["測試階段概述了 GitLab CI 為相關合併請求運行每個流水線所需的時間。當第壹個流水線運行完成後,數據將自動添加到此處。"],"The time taken by each data entry gathered by that stage.":["該階段每條數據所花的時間"],"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.":["中位數是壹個數列中最中間的值。例如在 3、5、9 之間,中位數是 5。在 3、5、7、8 之間,中位數是 (5 + 7)/ 2 = 6。"],"This means you can not push code until you create an empty repository or import existing one.":["在創建壹個空的存儲庫或導入現有存儲庫之前,您將無法推送代碼。"],"Time before an issue gets scheduled":["議題被列入日程表的時間"],"Time before an issue starts implementation":["開始進行編碼前的時間"],"Time between merge request creation and merge/close":["從創建合併請求到被合併或關閉的時間"],"Time until first merge request":["創建第壹個合併請求之前的時間"],"Timeago|%s days ago":["%s 天前"],"Timeago|%s days remaining":["剩餘 %s 天"],"Timeago|%s hours remaining":["剩餘 %s 小時"],"Timeago|%s minutes ago":["%s 分鐘前"],"Timeago|%s minutes remaining":["剩餘 %s 分鐘"],"Timeago|%s months ago":["%s 個月前"],"Timeago|%s months remaining":["剩餘 %s 月"],"Timeago|%s seconds remaining":["剩餘 %s 秒"],"Timeago|%s weeks ago":["%s 星期前"],"Timeago|%s weeks remaining":["剩餘 %s 星期"],"Timeago|%s years ago":["%s 年前"],"Timeago|%s years remaining":["剩餘 %s 年"],"Timeago|1 day remaining":["剩餘 1 天"],"Timeago|1 hour remaining":["剩餘 1 小時"],"Timeago|1 minute remaining":["剩餘 1 分鐘"],"Timeago|1 month remaining":["剩餘 1 個月"],"Timeago|1 week remaining":["剩餘 1 星期"],"Timeago|1 year remaining":["剩餘 1 年"],"Timeago|Past due":["逾期"],"Timeago|a day ago":["1 天前"],"Timeago|a month ago":["1 個月前"],"Timeago|a week ago":["1 星期前"],"Timeago|a while":["剛剛"],"Timeago|a year ago":["1 年前"],"Timeago|about %s hours ago":["約 %s 小時前"],"Timeago|about a minute ago":["約 1 分鐘前"],"Timeago|about an hour ago":["約 1 小時前"],"Timeago|in %s days":[" %s 天後"],"Timeago|in %s hours":[" %s 小時後"],"Timeago|in %s minutes":[" %s 分鐘後"],"Timeago|in %s months":[" %s 個月後"],"Timeago|in %s seconds":[" %s 秒後"],"Timeago|in %s weeks":[" %s 星期後"],"Timeago|in %s years":[" %s 年後"],"Timeago|in 1 day":[" 1 天後"],"Timeago|in 1 hour":[" 1 小時後"],"Timeago|in 1 minute":[" 1 分鐘後"],"Timeago|in 1 month":[" 1 月後"],"Timeago|in 1 week":[" 1 星期後"],"Timeago|in 1 year":[" 1 年後"],"Timeago|less than a minute ago":["不到 1 分鐘前"],"Time|hr":["小時"],"Time|min":["分鐘"],"Time|s":["秒"],"Total Time":["總時間"],"Total test time for all commits/merges":["所有提交和合併的總測試時間"],"Unstar":["取消星標"],"Upload New File":["上傳新文件"],"Upload file":["上傳文件"],"Use your global notification setting":["使用全局通知設置"],"VisibilityLevel|Internal":["內部"],"VisibilityLevel|Private":["私有"],"VisibilityLevel|Public":["公開"],"Want to see the data? Please ask an administrator for access.":["權限不足。如需查看相關數據,請向管理員申請權限。"],"We don't have enough data to show this stage.":["該階段的數據不足,無法顯示。"],"Withdraw Access Request":["取消訪問請求"],"You are going to remove %{project_name_with_namespace}.\\nRemoved project CANNOT be restored!\\nAre you ABSOLUTELY sure?":["即將要刪除 %{project_name_with_namespace}。\\n已刪除的項目無法恢複!\\n確定繼續嗎?"],"You are going to remove the fork relationship to source project %{forked_from_project}. Are you ABSOLUTELY sure?":["即將刪除與源項目 %{forked_from_project} 的派生關系。確定繼續嗎?"],"You are going to transfer %{project_name_with_namespace} to another owner. Are you ABSOLUTELY sure?":["即將 %{project_name_with_namespace} 轉義給另壹個所有者。確定繼續嗎?"],"You can only add files when you are on a branch":["只能在分支上添加文件"],"You must sign in to star a project":["必須登錄才能對項目加星標"],"You need permission.":["需要相關的權限。"],"You will not get any notifications via email":["不會收到任何通知郵件"],"You will only receive notifications for the events you choose":["只接收您選擇的事件通知"],"You will only receive notifications for threads you have participated in":["只接收您參與的主題的通知"],"You will receive notifications for any activity":["接收所有活動的通知"],"You will receive notifications only for comments in which you were @mentioned":["只接收評論中提及(@)您的通知"],"You won't be able to pull or push project code via %{protocol} until you %{set_password_link} on your account":["在賬號上 %{set_password_link} 之前將無法通過 %{protocol} 拉取或推送代碼。"],"You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile":["在賬號中 %{add_ssh_key_link} 之前將無法通過 SSH 拉取或推送代碼。"],"Your name":["您的名字"],"day":["天"],"new merge request":["新建合併請求"],"notification emails":["通知郵件"],"parent":["父級"]}}}; \ No newline at end of file diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po index fc5feb0ab2c..8277c8d8e27 100644 --- a/locale/zh_HK/gitlab.po +++ b/locale/zh_HK/gitlab.po @@ -3,11 +3,11 @@ msgid "" msgstr "" "Project-Id-Version: gitlab 1.0.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-06-12 19:29-0500\n" +"POT-Creation-Date: 2017-06-15 14:57+0200\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-15 06:23-0400\n" +"PO-Revision-Date: 2017-06-15 10:34-0400\n" "Last-Translator: Huang Tao \n" "Language-Team: Chinese (Hong Kong) (https://translate.zanata.org/project/view/GitLab)\n" "Language: zh-HK\n" @@ -86,11 +86,8 @@ msgstr "還原分支" msgid "ChangeTypeAction|Cherry-pick" msgstr "優選" -msgid "ChangeType|commit" -msgstr "提交" - -msgid "ChangeType|merge request" -msgstr "合併請求" +msgid "ChangeTypeAction|Revert" +msgstr "還原" msgid "Changelog" msgstr "更新日誌" @@ -101,7 +98,7 @@ msgstr "統計圖" msgid "Cherry-pick this commit" msgstr "優選此提交" -msgid "Cherry-pick this merge-request" +msgid "Cherry-pick this merge request" msgstr "優選此合併請求" msgid "CiStatusLabel|canceled" @@ -165,6 +162,9 @@ msgstr[0] "提交" msgid "Commit message" msgstr "提交信息" +msgid "CommitBoxTitle|Commit" +msgstr "提交" + msgid "CommitMessage|Add %{file_name}" msgstr "添加 %{file_name}" @@ -219,9 +219,6 @@ msgstr "Cron 時區" msgid "Cron syntax" msgstr "Cron 語法" -msgid "Custom" -msgstr "自定義" - msgid "Custom notification events" msgstr "自定義通知事件" @@ -399,6 +396,9 @@ msgstr "最後提交" msgid "Learn more in the" msgstr "了解更多" +msgid "Learn more in the|pipeline schedules documentation" +msgstr "流水線計劃文檔" + msgid "Leave group" msgstr "退出群組" @@ -563,6 +563,15 @@ msgstr "取得所有者" msgid "PipelineSchedules|Target" msgstr "目標" +msgid "PipelineSheduleIntervalPattern|Custom" +msgstr "自定義" + +msgid "Pipeline|with stage" +msgstr "於階段" + +msgid "Pipeline|with stages" +msgstr "於階段" + msgid "Project '%{project_name}' queued for deletion." msgstr "項目 '%{project_name}' 已進入刪除隊列。" @@ -658,7 +667,7 @@ msgstr "申請訪問" msgid "Revert this commit" msgstr "還原此提交" -msgid "Revert this merge-request" +msgid "Revert this merge request" msgstr "還原此合併請求" msgid "Save pipeline schedule" @@ -707,6 +716,9 @@ msgstr "源代碼" msgid "StarProject|Star" msgstr "星標" +msgid "Start a %{new_merge_request} with these changes" +msgstr "由此更改 %{new_merge_request}" + msgid "Start a new merge request with these changes" msgstr "由此更改創建新合併請求" @@ -1047,6 +1059,9 @@ msgid "day" msgid_plural "days" msgstr[0] "天" +msgid "new merge request" +msgstr "新建合併請求" + msgid "notification emails" msgstr "通知郵件" @@ -1054,10 +1069,3 @@ msgid "parent" msgid_plural "parents" msgstr[0] "父級" -msgid "pipeline schedules documentation" -msgstr "流水線計劃文檔" - -msgid "with stage" -msgid_plural "with stages" -msgstr[0] "於階段" - From b97d5b65dd40fb5d8753c0677534e82cb5636f2d Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Fri, 16 Jun 2017 14:23:33 +0200 Subject: [PATCH 0083/1380] Use include ActiveModel::Model to hold metrics data parsed from yaml. --- .../prometheus/additional_metrics_parser.rb | 23 ++++++------------- lib/gitlab/prometheus/metric.rb | 15 ++++++------ lib/gitlab/prometheus/metric_group.rb | 10 +++----- .../additional_metrics_parser_spec.rb | 23 ++++++++++--------- spec/support/prometheus/metric_builders.rb | 4 ++-- 5 files changed, 32 insertions(+), 43 deletions(-) diff --git a/lib/gitlab/prometheus/additional_metrics_parser.rb b/lib/gitlab/prometheus/additional_metrics_parser.rb index 9bd41b99d81..70151e8c6ad 100644 --- a/lib/gitlab/prometheus/additional_metrics_parser.rb +++ b/lib/gitlab/prometheus/additional_metrics_parser.rb @@ -9,26 +9,17 @@ module Gitlab private - def metrics_from_list(list) - list.map { |entry| metric_from_entry(entry) } - end - - def metric_from_entry(entry) - required_fields = [:title, :required_metrics, :weight, :queries] - missing_fields = required_fields.select { |key| entry[key].nil? } - raise ParsingError.new("entry missing required fields #{missing_fields}") unless missing_fields.empty? - - Metric.new(entry[:title], entry[:required_metrics], entry[:weight], entry[:y_label], entry[:queries]) + def validate!(obj) + raise ParsingError.new(obj.errors.full_messages.join('\n')) unless obj.valid? end def group_from_entry(entry) - required_fields = [:group, :priority, :metrics] - missing_fields = required_fields.select { |key| entry[key].nil? } + entry[:name] = entry.delete(:group) + entry[:metrics]&.map! do |entry| + Metric.new(entry).tap(&method(:validate!)) + end - raise ParsingError.new("entry missing required fields #{missing_fields.map(&:to_s)}") unless missing_fields.empty? - - group = MetricGroup.new(entry[:group], entry[:priority]) - group.tap { |g| g.metrics = metrics_from_list(entry[:metrics]) } + MetricGroup.new(entry).tap(&method(:validate!)) end def additional_metrics_raw diff --git a/lib/gitlab/prometheus/metric.rb b/lib/gitlab/prometheus/metric.rb index 5155064317c..f54b2c6aaff 100644 --- a/lib/gitlab/prometheus/metric.rb +++ b/lib/gitlab/prometheus/metric.rb @@ -1,14 +1,15 @@ module Gitlab module Prometheus class Metric - attr_reader :group, :title, :required_metrics, :weight, :y_label, :queries + include ActiveModel::Model - def initialize(title, required_metrics, weight, y_label, queries = []) - @title = title - @required_metrics = required_metrics - @weight = weight - @y_label = y_label || 'Values' - @queries = queries + attr_accessor :title, :required_metrics, :weight, :y_label, :queries + + validates :title, :required_metrics, :weight, :y_label, :queries, presence: true + + def initialize(params = {}) + super(params) + @y_label ||= 'Values' end end end diff --git a/lib/gitlab/prometheus/metric_group.rb b/lib/gitlab/prometheus/metric_group.rb index 12bdf407ce0..729fef34b35 100644 --- a/lib/gitlab/prometheus/metric_group.rb +++ b/lib/gitlab/prometheus/metric_group.rb @@ -1,14 +1,10 @@ module Gitlab module Prometheus class MetricGroup - attr_reader :priority, :name - attr_accessor :metrics + include ActiveModel::Model - def initialize(name, priority, metrics = []) - @name = name - @priority = priority - @metrics = metrics - end + attr_accessor :name, :priority, :metrics + validates :name, :priority, :metrics, presence: true def self.all AdditionalMetricsParser.load_groups_from_yaml diff --git a/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb b/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb index 97280de173e..f8b2746b43d 100644 --- a/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb +++ b/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb @@ -26,7 +26,7 @@ describe Gitlab::Prometheus::AdditionalMetricsParser, lib: true do priority: 1 metrics: - title: title - required_metrics: [] + required_metrics: ['metric_a'] weight: 1 queries: [{query_range: query_range_a}] EOF @@ -54,7 +54,7 @@ describe Gitlab::Prometheus::AdditionalMetricsParser, lib: true do expect(metrics.count).to eq(3) expect(metrics[0]).to have_attributes(title: 'title', required_metrics: %w(metric_a metric_b), weight: 1) expect(metrics[1]).to have_attributes(title: 'title', required_metrics: %w(metric_a), weight: 1) - expect(metrics[2]).to have_attributes(title: 'title', required_metrics: [], weight: 1) + expect(metrics[2]).to have_attributes(title: 'title', required_metrics: %w{metric_a}, weight: 1) end it 'provides query data' do @@ -78,7 +78,7 @@ describe Gitlab::Prometheus::AdditionalMetricsParser, lib: true do end it 'throws parsing error' do - expect { subject }.to raise_error(parser_error_class, /missing.*#{field_name}/) + expect { subject }.to raise_error(parser_error_class, /#{field_name} can't be blank/i) end end @@ -88,13 +88,13 @@ describe Gitlab::Prometheus::AdditionalMetricsParser, lib: true do end it 'throws parsing error' do - expect { subject }.to raise_error(parser_error_class, /missing.*#{field_name}/) + expect { subject }.to raise_error(parser_error_class, /#{field_name} can't be blank/i) end end end describe 'group required fields' do - it_behaves_like 'required field', :metrics do + it_behaves_like 'required field', 'metrics' do let(:field_nil) do <<-EOF.strip_heredoc - group: group_a @@ -111,10 +111,11 @@ describe Gitlab::Prometheus::AdditionalMetricsParser, lib: true do end end - it_behaves_like 'required field', :group do + it_behaves_like 'required field', 'name' do let(:field_nil) do <<-EOF.strip_heredoc - - priority: 1 + - group: + priority: 1 metrics: [] EOF end @@ -127,7 +128,7 @@ describe Gitlab::Prometheus::AdditionalMetricsParser, lib: true do end end - it_behaves_like 'required field', :priority do + it_behaves_like 'required field', 'priority' do let(:field_nil) do <<-EOF.strip_heredoc - group: group_a @@ -146,7 +147,7 @@ describe Gitlab::Prometheus::AdditionalMetricsParser, lib: true do end describe 'metrics fields parsing' do - it_behaves_like 'required field', :title do + it_behaves_like 'required field', 'title' do let(:field_nil) do <<-EOF.strip_heredoc - group: group_a @@ -171,7 +172,7 @@ describe Gitlab::Prometheus::AdditionalMetricsParser, lib: true do end end - it_behaves_like 'required field', :required_metrics do + it_behaves_like 'required field', 'required metrics' do let(:field_nil) do <<-EOF.strip_heredoc - group: group_a @@ -196,7 +197,7 @@ describe Gitlab::Prometheus::AdditionalMetricsParser, lib: true do end end - it_behaves_like 'required field', :weight do + it_behaves_like 'required field', 'weight' do let(:field_nil) do <<-EOF.strip_heredoc - group: group_a diff --git a/spec/support/prometheus/metric_builders.rb b/spec/support/prometheus/metric_builders.rb index e4b55c22acd..c8d056d3fc8 100644 --- a/spec/support/prometheus/metric_builders.rb +++ b/spec/support/prometheus/metric_builders.rb @@ -9,7 +9,7 @@ module Prometheus end def simple_metric(title: 'title', required_metrics: [], queries: [simple_query]) - Gitlab::Prometheus::Metric.new(title, required_metrics, 1, nil, queries) + Gitlab::Prometheus::Metric.new(title: title, required_metrics: required_metrics, weight: 1, queries: queries) end def simple_metrics(added_metric_name: 'metric_a') @@ -21,7 +21,7 @@ module Prometheus end def simple_metric_group(name: 'name', metrics: simple_metrics) - Gitlab::Prometheus::MetricGroup.new( name, 1, metrics) + Gitlab::Prometheus::MetricGroup.new(name: name, priority: 1, metrics: metrics) end end end From 07a65da1d96a71474f6997aed95bac6290d81a42 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Fri, 16 Jun 2017 22:15:40 +0800 Subject: [PATCH 0084/1380] Generate KUBECONFIG in KubernetesService#predefined_variables --- .../project_services/kubernetes_service.rb | 14 ++++++- lib/gitlab/kubernetes.rb | 39 ++++++++++++++++++ .../fixtures/config/kubeconfig-without-ca.yml | 18 +++++++++ spec/fixtures/config/kubeconfig.yml | 19 +++++++++ spec/lib/gitlab/kubernetes_spec.rb | 24 +++++++++++ .../kubernetes_service_spec.rb | 40 ++++++++++++------- 6 files changed, 138 insertions(+), 16 deletions(-) create mode 100644 spec/fixtures/config/kubeconfig-without-ca.yml create mode 100644 spec/fixtures/config/kubeconfig.yml diff --git a/app/models/project_services/kubernetes_service.rb b/app/models/project_services/kubernetes_service.rb index 48e7802c557..f1b321139d3 100644 --- a/app/models/project_services/kubernetes_service.rb +++ b/app/models/project_services/kubernetes_service.rb @@ -96,10 +96,14 @@ class KubernetesService < DeploymentService end def predefined_variables + config = YAML.dump(kubeconfig) + variables = [ { key: 'KUBE_URL', value: api_url, public: true }, { key: 'KUBE_TOKEN', value: token, public: false }, - { key: 'KUBE_NAMESPACE', value: actual_namespace, public: true } + { key: 'KUBE_NAMESPACE', value: actual_namespace, public: true }, + { key: 'KUBECONFIG', value: config, public: false }, + { key: 'KUBECONFIG_FILE', value: config, public: false, file: true }, ] if ca_pem.present? @@ -135,6 +139,14 @@ class KubernetesService < DeploymentService private + def kubeconfig + to_kubeconfig( + url: api_url, + namespace: actual_namespace, + token: token, + ca_pem: ca_pem) + end + def namespace_placeholder default_namespace || TEMPLATE_PLACEHOLDER end diff --git a/lib/gitlab/kubernetes.rb b/lib/gitlab/kubernetes.rb index c56c1a4322f..cedef9b65ba 100644 --- a/lib/gitlab/kubernetes.rb +++ b/lib/gitlab/kubernetes.rb @@ -76,5 +76,44 @@ module Gitlab url.to_s end + + def to_kubeconfig(url:, namespace:, token:, ca_pem: nil) + config = { + apiVersion: 'v1', + clusters: [ + name: 'gitlab-deploy', + cluster: { + server: url + }, + ], + contexts: [ + name: 'gitlab-deploy', + context: { + cluster: 'gitlab-deploy', + namespace: namespace, + user: 'gitlab-deploy' + }, + ], + :'current-context' => 'gitlab-deploy', + kind: 'Config', + users: [ + { + name: 'gitlab-deploy', + user: {token: token} + } + ] + } + + kubeconfig_embed_ca_pem(config, ca_pem) if ca_pem + + config.deep_stringify_keys + end + + private + + def kubeconfig_embed_ca_pem(config, ca_pem) + cluster = config.dig(:clusters, 0, :cluster) + cluster[:'certificate-authority-data'] = ca_pem + end end end diff --git a/spec/fixtures/config/kubeconfig-without-ca.yml b/spec/fixtures/config/kubeconfig-without-ca.yml new file mode 100644 index 00000000000..b2cb989d548 --- /dev/null +++ b/spec/fixtures/config/kubeconfig-without-ca.yml @@ -0,0 +1,18 @@ +--- +apiVersion: v1 +clusters: +- name: gitlab-deploy + cluster: + server: https://kube.domain.com +contexts: +- name: gitlab-deploy + context: + cluster: gitlab-deploy + namespace: NAMESPACE + user: gitlab-deploy +current-context: gitlab-deploy +kind: Config +users: +- name: gitlab-deploy + user: + token: TOKEN diff --git a/spec/fixtures/config/kubeconfig.yml b/spec/fixtures/config/kubeconfig.yml new file mode 100644 index 00000000000..4fa52818fee --- /dev/null +++ b/spec/fixtures/config/kubeconfig.yml @@ -0,0 +1,19 @@ +--- +apiVersion: v1 +clusters: +- name: gitlab-deploy + cluster: + server: https://kube.domain.com + certificate-authority-data: PEM +contexts: +- name: gitlab-deploy + context: + cluster: gitlab-deploy + namespace: NAMESPACE + user: gitlab-deploy +current-context: gitlab-deploy +kind: Config +users: +- name: gitlab-deploy + user: + token: TOKEN diff --git a/spec/lib/gitlab/kubernetes_spec.rb b/spec/lib/gitlab/kubernetes_spec.rb index e8c599a95ee..34b33772578 100644 --- a/spec/lib/gitlab/kubernetes_spec.rb +++ b/spec/lib/gitlab/kubernetes_spec.rb @@ -46,4 +46,28 @@ describe Gitlab::Kubernetes do expect(filter_by_label(items, app: 'foo')).to eq(matching_items) end end + + describe '#to_kubeconfig' do + subject do + to_kubeconfig( + url: 'https://kube.domain.com', + namespace: 'NAMESPACE', + token: 'TOKEN', + ca_pem: ca_pem) + end + + context 'when CA PEM is provided' do + let(:ca_pem) { 'PEM' } + let(:path) { expand_fixture_path('config/kubeconfig.yml') } + + it { is_expected.to eq(YAML.load_file(path)) } + end + + context 'when CA PEM is not provided' do + let(:ca_pem) { nil } + let(:path) { expand_fixture_path('config/kubeconfig-without-ca.yml') } + + it { is_expected.to eq(YAML.load_file(path)) } + end + end end diff --git a/spec/models/project_services/kubernetes_service_spec.rb b/spec/models/project_services/kubernetes_service_spec.rb index 858ad595dbf..f69e273cd7c 100644 --- a/spec/models/project_services/kubernetes_service_spec.rb +++ b/spec/models/project_services/kubernetes_service_spec.rb @@ -129,7 +129,7 @@ describe KubernetesService, models: true, caching: true do it "returns the default namespace" do is_expected.to eq(service.send(:default_namespace)) end - + context 'when namespace is specified' do before do service.namespace = 'my-namespace' @@ -201,6 +201,13 @@ describe KubernetesService, models: true, caching: true do end describe '#predefined_variables' do + let(:kubeconfig) do + File.read(expand_fixture_path('config/kubeconfig.yml')) + .gsub('TOKEN', 'token') + .gsub('PEM', 'CA PEM DATA') + .gsub('NAMESPACE', namespace) + end + before do subject.api_url = 'https://kube.domain.com' subject.token = 'token' @@ -208,32 +215,35 @@ describe KubernetesService, models: true, caching: true do subject.project = project end - context 'namespace is provided' do - before do - subject.namespace = 'my-project' - end - + shared_examples 'setting variables' do it 'sets the variables' do expect(subject.predefined_variables).to include( { key: 'KUBE_URL', value: 'https://kube.domain.com', public: true }, { key: 'KUBE_TOKEN', value: 'token', public: false }, - { key: 'KUBE_NAMESPACE', value: 'my-project', public: true }, + { key: 'KUBE_NAMESPACE', value: namespace, public: true }, + { key: 'KUBECONFIG', value: kubeconfig, public: false }, + { key: 'KUBECONFIG_FILE', value: kubeconfig, public: false, file: true }, { key: 'KUBE_CA_PEM', value: 'CA PEM DATA', public: true }, { key: 'KUBE_CA_PEM_FILE', value: 'CA PEM DATA', public: true, file: true } ) end end - context 'no namespace provided' do - it 'sets the variables' do - expect(subject.predefined_variables).to include( - { key: 'KUBE_URL', value: 'https://kube.domain.com', public: true }, - { key: 'KUBE_TOKEN', value: 'token', public: false }, - { key: 'KUBE_CA_PEM', value: 'CA PEM DATA', public: true }, - { key: 'KUBE_CA_PEM_FILE', value: 'CA PEM DATA', public: true, file: true } - ) + context 'namespace is provided' do + let(:namespace) { 'my-project' } + + before do + subject.namespace = namespace end + it_behaves_like 'setting variables' + end + + context 'no namespace provided' do + let(:namespace) { subject.actual_namespace } + + it_behaves_like 'setting variables' + it 'sets the KUBE_NAMESPACE' do kube_namespace = subject.predefined_variables.find { |h| h[:key] == 'KUBE_NAMESPACE' } From 6eaec942e6ae89818ea1ba0da5ff00daea633c41 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Fri, 16 Jun 2017 22:26:40 +0800 Subject: [PATCH 0085/1380] Changelog entry, doc, and only pass KUBECONFIG_FILE --- app/models/project_services/kubernetes_service.rb | 3 +-- changelogs/unreleased/33360-generate-kubeconfig.yml | 4 ++++ doc/user/project/integrations/kubernetes.md | 1 + spec/models/project_services/kubernetes_service_spec.rb | 1 - 4 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 changelogs/unreleased/33360-generate-kubeconfig.yml diff --git a/app/models/project_services/kubernetes_service.rb b/app/models/project_services/kubernetes_service.rb index f1b321139d3..831f4e5a3c8 100644 --- a/app/models/project_services/kubernetes_service.rb +++ b/app/models/project_services/kubernetes_service.rb @@ -102,8 +102,7 @@ class KubernetesService < DeploymentService { key: 'KUBE_URL', value: api_url, public: true }, { key: 'KUBE_TOKEN', value: token, public: false }, { key: 'KUBE_NAMESPACE', value: actual_namespace, public: true }, - { key: 'KUBECONFIG', value: config, public: false }, - { key: 'KUBECONFIG_FILE', value: config, public: false, file: true }, + { key: 'KUBECONFIG_FILE', value: config, public: false, file: true } ] if ca_pem.present? diff --git a/changelogs/unreleased/33360-generate-kubeconfig.yml b/changelogs/unreleased/33360-generate-kubeconfig.yml new file mode 100644 index 00000000000..354a8a7f9b4 --- /dev/null +++ b/changelogs/unreleased/33360-generate-kubeconfig.yml @@ -0,0 +1,4 @@ +--- +title: Provide KUBECONFIG_FILE from KubernetesService for runners +merge_request: 12223 +author: diff --git a/doc/user/project/integrations/kubernetes.md b/doc/user/project/integrations/kubernetes.md index 73fa83d72a8..d1c3e18a276 100644 --- a/doc/user/project/integrations/kubernetes.md +++ b/doc/user/project/integrations/kubernetes.md @@ -55,6 +55,7 @@ GitLab CI build environment: - `KUBE_CA_PEM_FILE` - only present if a custom CA bundle was specified. Path to a file containing PEM data. - `KUBE_CA_PEM` (deprecated)- only if a custom CA bundle was specified. Raw PEM data. +- `KUBECONFIG_FILE` - Path to a file containing kubeconfig for this deployment. CA bundle would be embedded if specified. ## Web terminals diff --git a/spec/models/project_services/kubernetes_service_spec.rb b/spec/models/project_services/kubernetes_service_spec.rb index f69e273cd7c..d4feae231bc 100644 --- a/spec/models/project_services/kubernetes_service_spec.rb +++ b/spec/models/project_services/kubernetes_service_spec.rb @@ -221,7 +221,6 @@ describe KubernetesService, models: true, caching: true do { key: 'KUBE_URL', value: 'https://kube.domain.com', public: true }, { key: 'KUBE_TOKEN', value: 'token', public: false }, { key: 'KUBE_NAMESPACE', value: namespace, public: true }, - { key: 'KUBECONFIG', value: kubeconfig, public: false }, { key: 'KUBECONFIG_FILE', value: kubeconfig, public: false, file: true }, { key: 'KUBE_CA_PEM', value: 'CA PEM DATA', public: true }, { key: 'KUBE_CA_PEM_FILE', value: 'CA PEM DATA', public: true, file: true } From 64bb0d37d4ef1f8574355019f198e40bc9b70224 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Fri, 16 Jun 2017 16:53:02 +0200 Subject: [PATCH 0086/1380] cleanup wip --- .../projects/deployments_controller_spec.rb | 2 ++ .../projects/environments_controller_spec.rb | 12 +++++++----- spec/javascripts/fixtures/prometheus_service.rb | 1 - 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/spec/controllers/projects/deployments_controller_spec.rb b/spec/controllers/projects/deployments_controller_spec.rb index 26d92e787c4..c3b4f812db9 100644 --- a/spec/controllers/projects/deployments_controller_spec.rb +++ b/spec/controllers/projects/deployments_controller_spec.rb @@ -42,6 +42,7 @@ describe Projects::DeploymentsController do before do allow(controller).to receive(:deployment).and_return(deployment) end + context 'when metrics are disabled' do before do allow(deployment).to receive(:has_metrics?).and_return false @@ -114,6 +115,7 @@ describe Projects::DeploymentsController do before do allow(controller).to receive(:deployment).and_return(deployment) end + context 'when metrics are disabled' do before do allow(deployment).to receive(:has_metrics?).and_return false diff --git a/spec/controllers/projects/environments_controller_spec.rb b/spec/controllers/projects/environments_controller_spec.rb index ab171cde6bf..749b090d6e0 100644 --- a/spec/controllers/projects/environments_controller_spec.rb +++ b/spec/controllers/projects/environments_controller_spec.rb @@ -338,11 +338,13 @@ describe Projects::EnvironmentsController do context 'when environment has some metrics' do before do - expect(environment).to receive(:additional_metrics).and_return({ - success: true, - data: {}, - last_update: 42 - }) + expect(environment) + .to receive(:additional_metrics) + .and_return({ + success: true, + data: {}, + last_update: 42 + }) end it 'returns a metrics JSON document' do diff --git a/spec/javascripts/fixtures/prometheus_service.rb b/spec/javascripts/fixtures/prometheus_service.rb index 7dfbf885fbd..4aa6ea3cdfc 100644 --- a/spec/javascripts/fixtures/prometheus_service.rb +++ b/spec/javascripts/fixtures/prometheus_service.rb @@ -8,7 +8,6 @@ describe Projects::ServicesController, '(JavaScript fixtures)', type: :controlle let(:project) { create(:project_empty_repo, namespace: namespace, path: 'services-project') } let!(:service) { create(:prometheus_service, project: project) } - render_views before(:all) do From 6fe2b79656cca21f9f1cea504e5cbb58a51a05ab Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Fri, 16 Jun 2017 23:17:06 +0800 Subject: [PATCH 0087/1380] Fix rubocop offense --- lib/gitlab/kubernetes.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/gitlab/kubernetes.rb b/lib/gitlab/kubernetes.rb index cedef9b65ba..88bae87211a 100644 --- a/lib/gitlab/kubernetes.rb +++ b/lib/gitlab/kubernetes.rb @@ -84,7 +84,7 @@ module Gitlab name: 'gitlab-deploy', cluster: { server: url - }, + } ], contexts: [ name: 'gitlab-deploy', @@ -92,14 +92,14 @@ module Gitlab cluster: 'gitlab-deploy', namespace: namespace, user: 'gitlab-deploy' - }, + } ], - :'current-context' => 'gitlab-deploy', + 'current-context': 'gitlab-deploy', kind: 'Config', users: [ { name: 'gitlab-deploy', - user: {token: token} + user: { token: token } } ] } From be5f665557fc4f5b10d34f407545486746af54b8 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Fri, 16 Jun 2017 18:26:40 +0200 Subject: [PATCH 0088/1380] Fix prometheus service frontend fixture --- spec/javascripts/fixtures/prometheus_service.rb | 4 ++-- .../javascripts/prometheus_metrics/prometheus_metrics_spec.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/javascripts/fixtures/prometheus_service.rb b/spec/javascripts/fixtures/prometheus_service.rb index 4aa6ea3cdfc..3200577b326 100644 --- a/spec/javascripts/fixtures/prometheus_service.rb +++ b/spec/javascripts/fixtures/prometheus_service.rb @@ -11,14 +11,14 @@ describe Projects::ServicesController, '(JavaScript fixtures)', type: :controlle render_views before(:all) do - clean_frontend_fixtures('services/') + clean_frontend_fixtures('services/prometheus') end before(:each) do sign_in(admin) end - it 'services/prometheus_service.html.raw' do |example| + it 'services/prometheus/prometheus_service.html.raw' do |example| get :edit, namespace_id: namespace, project_id: project, diff --git a/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js b/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js index e7187a8a5e0..2b3a821dbd9 100644 --- a/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js +++ b/spec/javascripts/prometheus_metrics/prometheus_metrics_spec.js @@ -3,7 +3,7 @@ import PANEL_STATE from '~/prometheus_metrics/constants'; import { metrics, missingVarMetrics } from './mock_data'; describe('PrometheusMetrics', () => { - const FIXTURE = 'services/prometheus_service.html.raw'; + const FIXTURE = 'services/prometheus/prometheus_service.html.raw'; preloadFixtures(FIXTURE); beforeEach(() => { From 6e4d5334211d73dd731cb8757b2ef10e8ea428b7 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Fri, 16 Jun 2017 20:48:34 +0200 Subject: [PATCH 0089/1380] Move Prometheus service to project model --- app/controllers/projects/deployments_controller.rb | 2 +- app/controllers/projects/prometheus_controller.rb | 8 ++------ app/models/deployment.rb | 14 +++++++------- app/models/environment.rb | 8 ++------ app/models/project.rb | 4 ++++ .../projects/deployments_controller_spec.rb | 2 +- .../projects/prometheus_controller_spec.rb | 2 +- spec/models/deployment_spec.rb | 7 ++++--- 8 files changed, 22 insertions(+), 25 deletions(-) diff --git a/app/controllers/projects/deployments_controller.rb b/app/controllers/projects/deployments_controller.rb index e7d95e46b06..acf5573935a 100644 --- a/app/controllers/projects/deployments_controller.rb +++ b/app/controllers/projects/deployments_controller.rb @@ -23,7 +23,7 @@ class Projects::DeploymentsController < Projects::ApplicationController end def additional_metrics - return render_404 unless deployment.prometheus_service.present? + return render_404 unless deployment.has_additional_metrics? metrics = deployment.additional_metrics diff --git a/app/controllers/projects/prometheus_controller.rb b/app/controllers/projects/prometheus_controller.rb index 9609fa44945..7b828981dd8 100644 --- a/app/controllers/projects/prometheus_controller.rb +++ b/app/controllers/projects/prometheus_controller.rb @@ -5,7 +5,7 @@ class Projects::PrometheusController < Projects::ApplicationController def active_metrics respond_to do |format| format.json do - matched_metrics = prometheus_service.matched_metrics || {} + matched_metrics = project.prometheus_service.matched_metrics || {} if matched_metrics.any? render json: matched_metrics @@ -22,11 +22,7 @@ class Projects::PrometheusController < Projects::ApplicationController render_404 end - def prometheus_service - @prometheus_service ||= project.monitoring_services.reorder(nil).find_by(active: true, type: PrometheusService.name) - end - def require_prometheus_metrics! - render_404 unless prometheus_service.present? + render_404 unless project.prometheus_service.present? end end diff --git a/app/models/deployment.rb b/app/models/deployment.rb index 04d08f2cfd5..00bf0c118ae 100644 --- a/app/models/deployment.rb +++ b/app/models/deployment.rb @@ -114,15 +114,15 @@ class Deployment < ActiveRecord::Base project.monitoring_service.deployment_metrics(self) end - def additional_metrics - return {} unless prometheus_service.present? - - metrics = prometheus_service.additional_deployment_metrics(self) - metrics&.merge(deployment_time: created_at.to_i) || {} + def has_additional_metrics? + project.prometheus_service.present? end - def prometheus_service - @prometheus_service ||= project.monitoring_services.reorder(nil).find_by(active: true, type: PrometheusService.name) + def additional_metrics + return {} unless project.prometheus_service.present? + + metrics = project.prometheus_service.additional_deployment_metrics(self) + metrics&.merge(deployment_time: created_at.to_i) || {} end private diff --git a/app/models/environment.rb b/app/models/environment.rb index 62db7e958ab..b391a487b30 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -158,19 +158,15 @@ class Environment < ActiveRecord::Base end def has_additional_metrics? - prometheus_service.present? && available? && last_deployment.present? + project.prometheus_service.present? && available? && last_deployment.present? end def additional_metrics if has_additional_metrics? - prometheus_service.additional_environment_metrics(self) + project.prometheus_service.additional_environment_metrics(self) end end - def prometheus_service - @prometheus_service ||= project.monitoring_services.reorder(nil).find_by(active: true, type: PrometheusService.name) - end - # An environment name is not necessarily suitable for use in URLs, DNS # or other third-party contexts, so provide a slugified version. A slug has # the following properties: diff --git a/app/models/project.rb b/app/models/project.rb index 4c394646787..f6338b92b9f 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -798,6 +798,10 @@ class Project < ActiveRecord::Base @monitoring_service ||= monitoring_services.reorder(nil).find_by(active: true) end + def prometheus_service + @prometheus_service ||= monitoring_services.find_by(active: true, type: PrometheusService.name) + end + def jira_tracker? issues_tracker.to_param == 'jira' end diff --git a/spec/controllers/projects/deployments_controller_spec.rb b/spec/controllers/projects/deployments_controller_spec.rb index c3b4f812db9..4a77d4d8289 100644 --- a/spec/controllers/projects/deployments_controller_spec.rb +++ b/spec/controllers/projects/deployments_controller_spec.rb @@ -132,7 +132,7 @@ describe Projects::DeploymentsController do let(:prometheus_service) { double('prometheus_service') } before do - allow(deployment).to receive(:prometheus_service).and_return(prometheus_service) + allow(deployment.project).to receive(:prometheus_service).and_return(prometheus_service) end context 'when environment has no metrics' do diff --git a/spec/controllers/projects/prometheus_controller_spec.rb b/spec/controllers/projects/prometheus_controller_spec.rb index a994ac6409f..eddf7275975 100644 --- a/spec/controllers/projects/prometheus_controller_spec.rb +++ b/spec/controllers/projects/prometheus_controller_spec.rb @@ -8,7 +8,7 @@ describe Projects::PrometheusController do before do allow(controller).to receive(:project).and_return(project) - allow(controller).to receive(:prometheus_service).and_return(prometheus_service) + allow(project).to receive(:prometheus_service).and_return(prometheus_service) project.add_master(user) sign_in(user) diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb index eba0175c54c..bb84d3fc13d 100644 --- a/spec/models/deployment_spec.rb +++ b/spec/models/deployment_spec.rb @@ -30,7 +30,7 @@ describe Deployment, models: true do end describe '#includes_commit?' do - let(:project) { create(:project, :repository) } + let(:project) { create(:project, :repository) } let(:environment) { create(:environment, project: project) } let(:deployment) do create(:deployment, environment: environment, sha: project.commit.id) @@ -91,7 +91,8 @@ describe Deployment, models: true do end describe '#additional_metrics' do - let(:deployment) { create(:deployment) } + let(:project) { create(:project) } + let(:deployment) { create(:deployment, project: project) } subject { deployment.additional_metrics } @@ -111,7 +112,7 @@ describe Deployment, models: true do let(:prometheus_service) { double('prometheus_service') } before do - allow(deployment).to receive(:prometheus_service).and_return(prometheus_service) + allow(project).to receive(:prometheus_service).and_return(prometheus_service) allow(prometheus_service).to receive(:additional_deployment_metrics).and_return(simple_metrics) end From 8b69523b014c9557bcb03bf0e695331ea9621312 Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Fri, 16 Jun 2017 20:54:15 +0200 Subject: [PATCH 0090/1380] move additional_metrics.yaml into prometheus/ config folder --- config/{ => prometheus}/additional_metrics.yml | 0 lib/gitlab/prometheus/additional_metrics_parser.rb | 2 +- spec/models/environment_spec.rb | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename config/{ => prometheus}/additional_metrics.yml (100%) diff --git a/config/additional_metrics.yml b/config/prometheus/additional_metrics.yml similarity index 100% rename from config/additional_metrics.yml rename to config/prometheus/additional_metrics.yml diff --git a/lib/gitlab/prometheus/additional_metrics_parser.rb b/lib/gitlab/prometheus/additional_metrics_parser.rb index 70151e8c6ad..c07afbac9ea 100644 --- a/lib/gitlab/prometheus/additional_metrics_parser.rb +++ b/lib/gitlab/prometheus/additional_metrics_parser.rb @@ -27,7 +27,7 @@ module Gitlab end def load_yaml_file - YAML.load_file(Rails.root.join('config/additional_metrics.yml')) + YAML.load_file(Rails.root.join('config/prometheus/additional_metrics.yml')) end end end diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb index f36c165ef7d..b0635c6a90a 100644 --- a/spec/models/environment_spec.rb +++ b/spec/models/environment_spec.rb @@ -475,7 +475,7 @@ describe Environment, models: true do end it 'returns the additional metrics from the deployment service' do - expect(environment.prometheus_service).to receive(:additional_environment_metrics) + expect(project.prometheus_service).to receive(:additional_environment_metrics) .with(environment) .and_return(:fake_metrics) From 13902e40a8c11ca8d19bd7dc7e7c44fc62ee31dc Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Fri, 16 Jun 2017 20:58:18 +0200 Subject: [PATCH 0091/1380] Memoize only yaml loading method --- lib/gitlab/prometheus/additional_metrics_parser.rb | 4 ++-- spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb | 5 ----- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/gitlab/prometheus/additional_metrics_parser.rb b/lib/gitlab/prometheus/additional_metrics_parser.rb index c07afbac9ea..cb95daf2260 100644 --- a/lib/gitlab/prometheus/additional_metrics_parser.rb +++ b/lib/gitlab/prometheus/additional_metrics_parser.rb @@ -23,11 +23,11 @@ module Gitlab end def additional_metrics_raw - @additional_metrics_raw ||= load_yaml_file&.map(&:deep_symbolize_keys).freeze + load_yaml_file&.map(&:deep_symbolize_keys).freeze end def load_yaml_file - YAML.load_file(Rails.root.join('config/prometheus/additional_metrics.yml')) + @loaded_yaml_file ||= YAML.load_file(Rails.root.join('config/prometheus/additional_metrics.yml')) end end end diff --git a/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb b/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb index f8b2746b43d..61d48b05454 100644 --- a/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb +++ b/spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb @@ -33,7 +33,6 @@ describe Gitlab::Prometheus::AdditionalMetricsParser, lib: true do end before do - described_class.instance_variable_set :@additional_metrics_raw, nil allow(described_class).to receive(:load_yaml_file) { YAML.load(sample_yaml) } end @@ -68,10 +67,6 @@ describe Gitlab::Prometheus::AdditionalMetricsParser, lib: true do end shared_examples 'required field' do |field_name| - before do - described_class.instance_variable_set :@additional_metrics_raw, nil - end - context "when #{field_name} is nil" do before do allow(described_class).to receive(:load_yaml_file) { YAML.load(field_missing) } From 3b4c07ac5fd173786d3e587a5af9ea27bfd0a707 Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Fri, 16 Jun 2017 16:56:32 -0500 Subject: [PATCH 0092/1380] refactor AwardsHandler into es class syntax --- app/assets/javascripts/awards_handler.js | 789 +++++++++++------------ 1 file changed, 392 insertions(+), 397 deletions(-) diff --git a/app/assets/javascripts/awards_handler.js b/app/assets/javascripts/awards_handler.js index adb45b0606d..ebe722061d7 100644 --- a/app/assets/javascripts/awards_handler.js +++ b/app/assets/javascripts/awards_handler.js @@ -1,3 +1,4 @@ +/* eslint-disable class-methods-use-this */ /* global Flash */ import Cookies from 'js-cookie'; @@ -68,141 +69,140 @@ function renderCategory(name, emojiList, opts = {}) { `; } -function AwardsHandler() { - this.eventListeners = []; - this.aliases = emojiAliases; - // If the user shows intent let's pre-build the menu - this.registerEventListener('one', $(document), 'mouseenter focus', '.js-add-award', 'mouseenter focus', () => { +export default class AwardsHandler { + constructor() { + this.eventListeners = []; + this.aliases = emojiAliases; + // If the user shows intent let's pre-build the menu + this.registerEventListener('one', $(document), 'mouseenter focus', '.js-add-award', 'mouseenter focus', () => { + const $menu = $('.emoji-menu'); + if ($menu.length === 0) { + requestAnimationFrame(() => { + this.createEmojiMenu(); + }); + } + // Prebuild the categoryMap + categoryMap = categoryMap || buildCategoryMap(); + }); + this.registerEventListener('on', $(document), 'click', '.js-add-award', (e) => { + e.stopPropagation(); + e.preventDefault(); + this.showEmojiMenu($(e.currentTarget)); + }); + + this.registerEventListener('on', $('html'), 'click', (e) => { + const $target = $(e.target); + if (!$target.closest('.emoji-menu-content').length) { + $('.js-awards-block.current').removeClass('current'); + } + if (!$target.closest('.emoji-menu').length) { + if ($('.emoji-menu').is(':visible')) { + $('.js-add-award.is-active').removeClass('is-active'); + $('.emoji-menu').removeClass('is-visible'); + } + } + }); + this.registerEventListener('on', $(document), 'click', '.js-emoji-btn', (e) => { + e.preventDefault(); + const $target = $(e.currentTarget); + const $glEmojiElement = $target.find('gl-emoji'); + const $spriteIconElement = $target.find('.icon'); + const emoji = ($glEmojiElement.length ? $glEmojiElement : $spriteIconElement).data('name'); + + $target.closest('.js-awards-block').addClass('current'); + this.addAward(this.getVotesBlock(), this.getAwardUrl(), emoji); + }); + } + + registerEventListener(method = 'on', element, ...args) { + element[method].call(element, ...args); + this.eventListeners.push({ + element, + args, + }); + } + + showEmojiMenu($addBtn) { + if ($addBtn.hasClass('js-note-emoji')) { + $addBtn.closest('.note').find('.js-awards-block').addClass('current'); + } else { + $addBtn.closest('.js-awards-block').addClass('current'); + } + const $menu = $('.emoji-menu'); - if ($menu.length === 0) { - requestAnimationFrame(() => { - this.createEmojiMenu(); + const $thumbsBtn = $menu.find('[data-name="thumbsup"], [data-name="thumbsdown"]').parent(); + const $userAuthored = this.isUserAuthored($addBtn); + if ($menu.length) { + if ($menu.is('.is-visible')) { + $addBtn.removeClass('is-active'); + $menu.removeClass('is-visible'); + $('.js-emoji-menu-search').blur(); + } else { + $addBtn.addClass('is-active'); + this.positionMenu($menu, $addBtn); + $menu.addClass('is-visible'); + $('.js-emoji-menu-search').focus(); + } + } else { + $addBtn.addClass('is-loading is-active'); + this.createEmojiMenu(() => { + const $createdMenu = $('.emoji-menu'); + $addBtn.removeClass('is-loading'); + this.positionMenu($createdMenu, $addBtn); + return setTimeout(() => { + $createdMenu.addClass('is-visible'); + $('.js-emoji-menu-search').focus(); + }, 200); }); } - // Prebuild the categoryMap + + $thumbsBtn.toggleClass('disabled', $userAuthored); + } + + // Create the emoji menu with the first category of emojis. + // Then render the remaining categories of emojis one by one to avoid jank. + createEmojiMenu(callback) { + if (this.isCreatingEmojiMenu) { + return; + } + this.isCreatingEmojiMenu = true; + + // Render the first category categoryMap = categoryMap || buildCategoryMap(); - }); - this.registerEventListener('on', $(document), 'click', '.js-add-award', (e) => { - e.stopPropagation(); - e.preventDefault(); - this.showEmojiMenu($(e.currentTarget)); - }); + const categoryNameKey = Object.keys(categoryMap)[0]; + const emojisInCategory = categoryMap[categoryNameKey]; + const firstCategory = renderCategory(categoryLabelMap[categoryNameKey], emojisInCategory); - this.registerEventListener('on', $('html'), 'click', (e) => { - const $target = $(e.target); - if (!$target.closest('.emoji-menu-content').length) { - $('.js-awards-block.current').removeClass('current'); + // Render the frequently used + const frequentlyUsedEmojis = this.getFrequentlyUsedEmojis(); + let frequentlyUsedCatgegory = ''; + if (frequentlyUsedEmojis.length > 0) { + frequentlyUsedCatgegory = renderCategory('Frequently used', frequentlyUsedEmojis, { + menuListClass: 'frequent-emojis', + }); } - if (!$target.closest('.emoji-menu').length) { - if ($('.emoji-menu').is(':visible')) { - $('.js-add-award.is-active').removeClass('is-active'); - $('.emoji-menu').removeClass('is-visible'); - } - } - }); - this.registerEventListener('on', $(document), 'click', '.js-emoji-btn', (e) => { - e.preventDefault(); - const $target = $(e.currentTarget); - const $glEmojiElement = $target.find('gl-emoji'); - const $spriteIconElement = $target.find('.icon'); - const emoji = ($glEmojiElement.length ? $glEmojiElement : $spriteIconElement).data('name'); - $target.closest('.js-awards-block').addClass('current'); - this.addAward(this.getVotesBlock(), this.getAwardUrl(), emoji); - }); -} + const emojiMenuMarkup = ` +
    + -AwardsHandler.prototype.registerEventListener = function registerEventListener(method = 'on', element, ...args) { - element[method].call(element, ...args); - this.eventListeners.push({ - element, - args, - }); -}; - -AwardsHandler.prototype.showEmojiMenu = function showEmojiMenu($addBtn) { - if ($addBtn.hasClass('js-note-emoji')) { - $addBtn.closest('.note').find('.js-awards-block').addClass('current'); - } else { - $addBtn.closest('.js-awards-block').addClass('current'); - } - - const $menu = $('.emoji-menu'); - const $thumbsBtn = $menu.find('[data-name="thumbsup"], [data-name="thumbsdown"]').parent(); - const $userAuthored = this.isUserAuthored($addBtn); - if ($menu.length) { - if ($menu.is('.is-visible')) { - $addBtn.removeClass('is-active'); - $menu.removeClass('is-visible'); - $('.js-emoji-menu-search').blur(); - } else { - $addBtn.addClass('is-active'); - this.positionMenu($menu, $addBtn); - $menu.addClass('is-visible'); - $('.js-emoji-menu-search').focus(); - } - } else { - $addBtn.addClass('is-loading is-active'); - this.createEmojiMenu(() => { - const $createdMenu = $('.emoji-menu'); - $addBtn.removeClass('is-loading'); - this.positionMenu($createdMenu, $addBtn); - return setTimeout(() => { - $createdMenu.addClass('is-visible'); - $('.js-emoji-menu-search').focus(); - }, 200); - }); - } - - $thumbsBtn.toggleClass('disabled', $userAuthored); -}; - -// Create the emoji menu with the first category of emojis. -// Then render the remaining categories of emojis one by one to avoid jank. -AwardsHandler.prototype.createEmojiMenu = function createEmojiMenu(callback) { - if (this.isCreatingEmojiMenu) { - return; - } - this.isCreatingEmojiMenu = true; - - // Render the first category - categoryMap = categoryMap || buildCategoryMap(); - const categoryNameKey = Object.keys(categoryMap)[0]; - const emojisInCategory = categoryMap[categoryNameKey]; - const firstCategory = renderCategory(categoryLabelMap[categoryNameKey], emojisInCategory); - - // Render the frequently used - const frequentlyUsedEmojis = this.getFrequentlyUsedEmojis(); - let frequentlyUsedCatgegory = ''; - if (frequentlyUsedEmojis.length > 0) { - frequentlyUsedCatgegory = renderCategory('Frequently used', frequentlyUsedEmojis, { - menuListClass: 'frequent-emojis', - }); - } - - const emojiMenuMarkup = ` -
    - - -
    - ${frequentlyUsedCatgegory} - ${firstCategory} +
    + ${frequentlyUsedCatgegory} + ${firstCategory} +
    -
    - `; + `; - document.body.insertAdjacentHTML('beforeend', emojiMenuMarkup); + document.body.insertAdjacentHTML('beforeend', emojiMenuMarkup); - this.addRemainingEmojiMenuCategories(); - this.setupSearch(); - if (callback) { - callback(); + this.addRemainingEmojiMenuCategories(); + this.setupSearch(); + if (callback) { + callback(); + } } -}; -AwardsHandler - .prototype - .addRemainingEmojiMenuCategories = function addRemainingEmojiMenuCategories() { + addRemainingEmojiMenuCategories() { if (this.isAddingRemainingEmojiMenuCategories) { return; } @@ -243,176 +243,174 @@ AwardsHandler emojiContentElement.insertAdjacentHTML('beforeend', '

    We encountered an error while adding the remaining categories

    '); throw new Error(`Error occurred in addRemainingEmojiMenuCategories: ${err.message}`); }); - }; - -AwardsHandler.prototype.positionMenu = function positionMenu($menu, $addBtn) { - const position = $addBtn.data('position'); - // The menu could potentially be off-screen or in a hidden overflow element - // So we position the element absolute in the body - const css = { - top: `${$addBtn.offset().top + $addBtn.outerHeight()}px`, - }; - if (position === 'right') { - css.left = `${($addBtn.offset().left - $menu.outerWidth()) + 20}px`; - $menu.addClass('is-aligned-right'); - } else { - css.left = `${$addBtn.offset().left}px`; - $menu.removeClass('is-aligned-right'); } - return $menu.css(css); -}; -AwardsHandler.prototype.addAward = function addAward( - votesBlock, - awardUrl, - emoji, - checkMutuality, - callback, -) { - const normalizedEmoji = this.normalizeEmojiName(emoji); - const $emojiButton = this.findEmojiIcon(votesBlock, normalizedEmoji).parent(); - this.postEmoji($emojiButton, awardUrl, normalizedEmoji, () => { - this.addAwardToEmojiBar(votesBlock, normalizedEmoji, checkMutuality); - return typeof callback === 'function' ? callback() : undefined; - }); - $('.emoji-menu').removeClass('is-visible'); - $('.js-add-award.is-active').removeClass('is-active'); -}; - -AwardsHandler.prototype.addAwardToEmojiBar = function addAwardToEmojiBar( - votesBlock, - emoji, - checkForMutuality, -) { - if (checkForMutuality || checkForMutuality === null) { - this.checkMutuality(votesBlock, emoji); - } - this.addEmojiToFrequentlyUsedList(emoji); - const normalizedEmoji = this.normalizeEmojiName(emoji); - const $emojiButton = this.findEmojiIcon(votesBlock, normalizedEmoji).parent(); - if ($emojiButton.length > 0) { - if (this.isActive($emojiButton)) { - this.decrementCounter($emojiButton, normalizedEmoji); + positionMenu($menu, $addBtn) { + const position = $addBtn.data('position'); + // The menu could potentially be off-screen or in a hidden overflow element + // So we position the element absolute in the body + const css = { + top: `${$addBtn.offset().top + $addBtn.outerHeight()}px`, + }; + if (position === 'right') { + css.left = `${($addBtn.offset().left - $menu.outerWidth()) + 20}px`; + $menu.addClass('is-aligned-right'); } else { - const counter = $emojiButton.find('.js-counter'); - counter.text(parseInt(counter.text(), 10) + 1); - $emojiButton.addClass('active'); - this.addYouToUserList(votesBlock, normalizedEmoji); - this.animateEmoji($emojiButton); + css.left = `${$addBtn.offset().left}px`; + $menu.removeClass('is-aligned-right'); } - } else { - votesBlock.removeClass('hidden'); - this.createEmoji(votesBlock, normalizedEmoji); - } -}; - -AwardsHandler.prototype.getVotesBlock = function getVotesBlock() { - const currentBlock = $('.js-awards-block.current'); - let resultantVotesBlock = currentBlock; - if (currentBlock.length === 0) { - resultantVotesBlock = $('.js-awards-block').eq(0); + return $menu.css(css); } - return resultantVotesBlock; -}; + addAward( + votesBlock, + awardUrl, + emoji, + checkMutuality, + callback, + ) { + const normalizedEmoji = this.normalizeEmojiName(emoji); + const $emojiButton = this.findEmojiIcon(votesBlock, normalizedEmoji).parent(); + this.postEmoji($emojiButton, awardUrl, normalizedEmoji, () => { + this.addAwardToEmojiBar(votesBlock, normalizedEmoji, checkMutuality); + return typeof callback === 'function' ? callback() : undefined; + }); + $('.emoji-menu').removeClass('is-visible'); + $('.js-add-award.is-active').removeClass('is-active'); + } -AwardsHandler.prototype.getAwardUrl = function getAwardUrl() { - return this.getVotesBlock().data('award-url'); -}; - -AwardsHandler.prototype.checkMutuality = function checkMutuality(votesBlock, emoji) { - const awardUrl = this.getAwardUrl(); - if (emoji === 'thumbsup' || emoji === 'thumbsdown') { - const mutualVote = emoji === 'thumbsup' ? 'thumbsdown' : 'thumbsup'; - const $emojiButton = votesBlock.find(`[data-name="${mutualVote}"]`).parent(); - const isAlreadyVoted = $emojiButton.hasClass('active'); - if (isAlreadyVoted) { - this.addAward(votesBlock, awardUrl, mutualVote, false); + addAwardToEmojiBar( + votesBlock, + emoji, + checkForMutuality, + ) { + if (checkForMutuality || checkForMutuality === null) { + this.checkMutuality(votesBlock, emoji); + } + this.addEmojiToFrequentlyUsedList(emoji); + const normalizedEmoji = this.normalizeEmojiName(emoji); + const $emojiButton = this.findEmojiIcon(votesBlock, normalizedEmoji).parent(); + if ($emojiButton.length > 0) { + if (this.isActive($emojiButton)) { + this.decrementCounter($emojiButton, normalizedEmoji); + } else { + const counter = $emojiButton.find('.js-counter'); + counter.text(parseInt(counter.text(), 10) + 1); + $emojiButton.addClass('active'); + this.addYouToUserList(votesBlock, normalizedEmoji); + this.animateEmoji($emojiButton); + } + } else { + votesBlock.removeClass('hidden'); + this.createEmoji(votesBlock, normalizedEmoji); } } -}; -AwardsHandler.prototype.isActive = function isActive($emojiButton) { - return $emojiButton.hasClass('active'); -}; + getVotesBlock() { + const currentBlock = $('.js-awards-block.current'); + let resultantVotesBlock = currentBlock; + if (currentBlock.length === 0) { + resultantVotesBlock = $('.js-awards-block').eq(0); + } -AwardsHandler.prototype.isUserAuthored = function isUserAuthored($button) { - return $button.hasClass('js-user-authored'); -}; + return resultantVotesBlock; + } -AwardsHandler.prototype.decrementCounter = function decrementCounter($emojiButton, emoji) { - const counter = $('.js-counter', $emojiButton); - const counterNumber = parseInt(counter.text(), 10); - if (counterNumber > 1) { - counter.text(counterNumber - 1); - this.removeYouFromUserList($emojiButton); - } else if (emoji === 'thumbsup' || emoji === 'thumbsdown') { - $emojiButton.tooltip('destroy'); - counter.text('0'); - this.removeYouFromUserList($emojiButton); - if ($emojiButton.parents('.note').length) { + getAwardUrl() { + return this.getVotesBlock().data('award-url'); + } + + checkMutuality(votesBlock, emoji) { + const awardUrl = this.getAwardUrl(); + if (emoji === 'thumbsup' || emoji === 'thumbsdown') { + const mutualVote = emoji === 'thumbsup' ? 'thumbsdown' : 'thumbsup'; + const $emojiButton = votesBlock.find(`[data-name="${mutualVote}"]`).parent(); + const isAlreadyVoted = $emojiButton.hasClass('active'); + if (isAlreadyVoted) { + this.addAward(votesBlock, awardUrl, mutualVote, false); + } + } + } + + isActive($emojiButton) { + return $emojiButton.hasClass('active'); + } + + isUserAuthored($button) { + return $button.hasClass('js-user-authored'); + } + + decrementCounter($emojiButton, emoji) { + const counter = $('.js-counter', $emojiButton); + const counterNumber = parseInt(counter.text(), 10); + if (counterNumber > 1) { + counter.text(counterNumber - 1); + this.removeYouFromUserList($emojiButton); + } else if (emoji === 'thumbsup' || emoji === 'thumbsdown') { + $emojiButton.tooltip('destroy'); + counter.text('0'); + this.removeYouFromUserList($emojiButton); + if ($emojiButton.parents('.note').length) { + this.removeEmoji($emojiButton); + } + } else { this.removeEmoji($emojiButton); } - } else { - this.removeEmoji($emojiButton); - } - return $emojiButton.removeClass('active'); -}; - -AwardsHandler.prototype.removeEmoji = function removeEmoji($emojiButton) { - $emojiButton.tooltip('destroy'); - $emojiButton.remove(); - const $votesBlock = this.getVotesBlock(); - if ($votesBlock.find('.js-emoji-btn').length === 0) { - $votesBlock.addClass('hidden'); - } -}; - -AwardsHandler.prototype.getAwardTooltip = function getAwardTooltip($awardBlock) { - return $awardBlock.attr('data-original-title') || $awardBlock.attr('data-title') || ''; -}; - -AwardsHandler.prototype.toSentence = function toSentence(list) { - let sentence; - if (list.length <= 2) { - sentence = list.join(' and '); - } else { - sentence = `${list.slice(0, -1).join(', ')}, and ${list[list.length - 1]}`; + return $emojiButton.removeClass('active'); } - return sentence; -}; - -AwardsHandler.prototype.removeYouFromUserList = function removeYouFromUserList($emojiButton) { - const awardBlock = $emojiButton; - const originalTitle = this.getAwardTooltip(awardBlock); - const authors = originalTitle.split(FROM_SENTENCE_REGEX); - authors.splice(authors.indexOf('You'), 1); - return awardBlock - .closest('.js-emoji-btn') - .removeData('title') - .removeAttr('data-title') - .removeAttr('data-original-title') - .attr('title', this.toSentence(authors)) - .tooltip('fixTitle'); -}; - -AwardsHandler.prototype.addYouToUserList = function addYouToUserList(votesBlock, emoji) { - const awardBlock = this.findEmojiIcon(votesBlock, emoji).parent(); - const origTitle = this.getAwardTooltip(awardBlock); - let users = []; - if (origTitle) { - users = origTitle.trim().split(FROM_SENTENCE_REGEX); + removeEmoji($emojiButton) { + $emojiButton.tooltip('destroy'); + $emojiButton.remove(); + const $votesBlock = this.getVotesBlock(); + if ($votesBlock.find('.js-emoji-btn').length === 0) { + $votesBlock.addClass('hidden'); + } } - users.unshift('You'); - return awardBlock - .attr('title', this.toSentence(users)) - .tooltip('fixTitle'); -}; -AwardsHandler - .prototype - .createAwardButtonForVotesBlock = function createAwardButtonForVotesBlock(votesBlock, emojiName) { + getAwardTooltip($awardBlock) { + return $awardBlock.attr('data-original-title') || $awardBlock.attr('data-title') || ''; + } + + toSentence(list) { + let sentence; + if (list.length <= 2) { + sentence = list.join(' and '); + } else { + sentence = `${list.slice(0, -1).join(', ')}, and ${list[list.length - 1]}`; + } + + return sentence; + } + + removeYouFromUserList($emojiButton) { + const awardBlock = $emojiButton; + const originalTitle = this.getAwardTooltip(awardBlock); + const authors = originalTitle.split(FROM_SENTENCE_REGEX); + authors.splice(authors.indexOf('You'), 1); + return awardBlock + .closest('.js-emoji-btn') + .removeData('title') + .removeAttr('data-title') + .removeAttr('data-original-title') + .attr('title', this.toSentence(authors)) + .tooltip('fixTitle'); + } + + addYouToUserList(votesBlock, emoji) { + const awardBlock = this.findEmojiIcon(votesBlock, emoji).parent(); + const origTitle = this.getAwardTooltip(awardBlock); + let users = []; + if (origTitle) { + users = origTitle.trim().split(FROM_SENTENCE_REGEX); + } + users.unshift('You'); + return awardBlock + .attr('title', this.toSentence(users)) + .tooltip('fixTitle'); + } + + createAwardButtonForVotesBlock(votesBlock, emojiName) { const buttonHtml = `