From ba6f50e43db36d8023cbb42edbc5b8553c3620d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Wed, 8 May 2024 10:04:47 +0200 Subject: [PATCH 01/10] Add release-notes file --- docs/release-notes/14-0-1/README.md | 30 +++++++++++++++++++++++++++++ docs/release-notes/README.md | 7 +++++++ 2 files changed, 37 insertions(+) create mode 100644 docs/release-notes/14-0-1/README.md diff --git a/docs/release-notes/14-0-1/README.md b/docs/release-notes/14-0-1/README.md new file mode 100644 index 000000000000..1364e998dfc8 --- /dev/null +++ b/docs/release-notes/14-0-1/README.md @@ -0,0 +1,30 @@ +--- +title: OpenProject 14.0.1 +sidebar_navigation: + title: 14.0.1 +release_version: 14.0.1 +release_date: 2024-05-08 +--- + +# OpenProject 14.0.1 + +Release date: 2024-05-08 + +We released [OpenProject 14.0.1](https://community.openproject.org/versions/2039). +The release contains several bug fixes and we recommend updating to the newest version. + + + +## Bug fixes and changes + + + + +- Bugfix: uninitialized constant CostQuery::Filter::CustomField \[[#54500](https://community.openproject.org/wp/54500)\] +- Bugfix: openDesk setup script fails \[[#54558](https://community.openproject.org/wp/54558)\] +- Bugfix: Totals of non-parent work packages are updated when status is changed in administration \[[#54646](https://community.openproject.org/wp/54646)\] +- Bugfix: User receives email updates even if their account is permanently locked \[[#54714](https://community.openproject.org/wp/54714)\] +- Feature: Snappier progress popover \[[#54464](https://community.openproject.org/wp/54464)\] + + + diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index e0087ca52b32..7dd039b09738 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -14,6 +14,13 @@ Stay up to date and get an overview of the new features included in the releases +## 14.0.1 + +Release date: 2024-05-08 + +[Release Notes](14-0-1/) + + ## 14.0.0 Release date: 2024-04-24 From 5adfa5a88a58350b080c83ef88e132a0630884cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Wed, 8 May 2024 10:04:48 +0200 Subject: [PATCH 02/10] Bumped version to 14.0.2 [ci skip] --- lib/open_project/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/open_project/version.rb b/lib/open_project/version.rb index ca7726f51a63..1746fbdb8ba6 100644 --- a/lib/open_project/version.rb +++ b/lib/open_project/version.rb @@ -33,7 +33,7 @@ module OpenProject module VERSION # :nodoc: MAJOR = 14 MINOR = 0 - PATCH = 1 + PATCH = 2 class << self # Used by semver to define the special version (if any). From 43227bfaf9b036d349a03ca6d238905f0f36858c Mon Sep 17 00:00:00 2001 From: Markus Kahl Date: Wed, 8 May 2024 12:42:57 +0100 Subject: [PATCH 03/10] schedule correct cron job for ldap_groups --- modules/ldap_groups/lib/open_project/ldap_groups/engine.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ldap_groups/lib/open_project/ldap_groups/engine.rb b/modules/ldap_groups/lib/open_project/ldap_groups/engine.rb index 50e9b44d4fdb..6523f93db6f4 100644 --- a/modules/ldap_groups/lib/open_project/ldap_groups/engine.rb +++ b/modules/ldap_groups/lib/open_project/ldap_groups/engine.rb @@ -21,9 +21,9 @@ class Engine < ::Rails::Engine add_cron_jobs do { - "Ldap::SynchronizationJob": { + "LdapGroups::SynchronizationJob": { cron: "30 23 * * *", # Run once per night at 11:30pm - class: Ldap::SynchronizationJob.name + class: LdapGroups::SynchronizationJob.name } } end From 3e11521dda9db5e0999e4a32670b36ad95689108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Wed, 8 May 2024 13:56:46 +0200 Subject: [PATCH 04/10] Backport docker build to 14.0 --- .dockerignore | 3 + .github/workflows/docker.yml | 141 ++++++++++++------ docker/prod/Dockerfile | 187 ++++++------------------ docker/prod/setup/postinstall-common.sh | 52 +------ docker/prod/setup/postinstall-onprem.sh | 43 ++++++ docker/prod/setup/precompile-assets.sh | 25 ++++ docker/prod/setup/preinstall-common.sh | 55 ++++--- 7 files changed, 247 insertions(+), 259 deletions(-) create mode 100755 docker/prod/setup/postinstall-onprem.sh create mode 100755 docker/prod/setup/precompile-assets.sh diff --git a/.dockerignore b/.dockerignore index bca449c8d7c1..9a5efd58414c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -33,3 +33,6 @@ frontend/node_modules node_modules # travis vendor/bundle +# allow precompiled assets to be injected +!/public/assets +!/config/frontend_assets.manifest.json diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index b1165957faa5..8f5866444471 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -3,7 +3,7 @@ name: Docker on: # build dev daily schedule: - - cron: '20 2 * * *' # Daily at 02:20 + - cron: "20 2 * * *" # Daily at 02:20 push: tags: @@ -21,7 +21,7 @@ env: REGISTRY_IMAGE: openproject/openproject jobs: - extract_version: + setup: runs-on: ubuntu-latest steps: - name: Extract version @@ -36,6 +36,11 @@ jobs: elif [[ ${{ github.event_name }} == 'workflow_dispatch' ]]; then TAG_REF=${{ inputs.tag }} CHECKOUT_REF=${{ inputs.tag }} + + if [ -z "$TAG_REF" ]; then + TAG_REF=dev + CHECKOUT_REF=dev + fi else echo "Unsupported event" exit 1 @@ -50,75 +55,105 @@ jobs: echo "Version: $VERSION" echo "version=$VERSION" >> "$GITHUB_OUTPUT" echo "checkout_ref=$CHECKOUT_REF" >> "$GITHUB_OUTPUT" + - uses: actions/checkout@v4 + - name: Cache NPM + uses: runs-on/cache@v4 + with: + path: | + frontend/node_modules + node_modules + key: nodejs-x64-${{ hashFiles('**/package-lock.json') }} + restore-keys: nodejs-x64- + - name: Cache angular + uses: runs-on/cache@v4 + with: + path: frontend/.angular + key: angular-${{ github.ref }} + restore-keys: angular- + - uses: ruby/setup-ruby@v1 + with: + bundler-cache: true + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + cache-dependency-path: | + package-lock.json + frontend/package-lock.json + - name: Precompile assets + run: | + ./docker/prod/setup/precompile-assets.sh + cp config/frontend_assets.manifest.json public/assets/frontend_assets.manifest.json + - uses: actions/upload-artifact@v3 + with: + path: public/ + name: public-assets-${{ github.sha }} outputs: version: ${{ steps.extract_version.outputs.version }} checkout_ref: ${{ steps.extract_version.outputs.checkout_ref }} build: needs: - - extract_version + - setup if: github.repository == 'opf/openproject' - runs-on: runs-on,runner=8cpu-linux,family=m7i+m7a,run-id=${{ github.run_id }} + runs-on: + labels: + - runs-on + - ssh=false + - run-id=${{ github.run_id }} + - ${{ matrix.runner }} strategy: matrix: include: - platform: linux/amd64 + bim_support: true target: slim + runner: runner=4cpu-linux-x64 - platform: linux/arm64/v8 + bim_support: false target: slim + runner: runner=4cpu-linux-arm64 - platform: linux/amd64 + bim_support: true target: all-in-one - - platform: linux/ppc64le + runner: runner=4cpu-linux-x64 + - platform: linux/arm64/v8 bim_support: false target: all-in-one - - platform: linux/arm64/v8 + runner: runner=4cpu-linux-arm64 + - platform: linux/ppc64le bim_support: false target: all-in-one + runner: runner=4cpu-linux-x64 steps: - - name: Extract version - id: extract_version - run: | - if [[ ${{ github.event_name }} == 'push' ]]; then - TAG_REF=${GITHUB_REF#refs/tags/} - CHECKOUT_REF=$GITHUB_REF - elif [[ ${{ github.event_name }} == 'schedule' ]]; then - TAG_REF=dev - CHECKOUT_REF=refs/heads/dev - elif [[ ${{ github.event_name }} == 'workflow_dispatch' ]]; then - TAG_REF=${{ inputs.tag }} - CHECKOUT_REF=${{ inputs.tag }} - else - echo "Unsupported event" - exit 1 - fi - - if [ -z "$TAG_REF" ] || [ -z "$CHECKOUT_REF" ]; then - echo "No TAG_REF or CHECKOUT_REF set. Aborting" - exit 1 - fi - - VERSION=${TAG_REF#v} - echo "Version: $VERSION" - echo "::set-output name=version::$VERSION" - echo "::set-output name=checkout_ref::$CHECKOUT_REF" - name: Checkout with: - ref: ${{ steps.extract_version.outputs.checkout_ref }} + ref: ${{ needs.setup.outputs.checkout_ref }} uses: actions/checkout@v4 - name: Prepare docker files run: | cp ./docker/prod/Dockerfile ./Dockerfile - - # Add build information - echo "${{ steps.extract_version.outputs.checkout_ref }}" > PRODUCT_VERSION - echo "https://github.com/opf/openproject/commits/${{ steps.extract_version.outputs.checkout_ref }}" > PRODUCT_URL + - name: Download precompiled public assets + uses: actions/download-artifact@v3 + with: + name: public-assets-${{ github.sha }} + path: public/ + - name: Setup precompiled assets + run: | + ls -al public/ + mv public/assets/frontend_assets.manifest.json config/frontend_assets.manifest.json + ls -al config/frontend_assets.manifest.json + - name: Add build information + run: | + echo "${{ needs.setup.outputs.checkout_ref }}" > PRODUCT_VERSION + echo "https://github.com/opf/openproject/commits/${{ needs.setup.outputs.checkout_ref }}" > PRODUCT_URL date -u +"%Y-%m-%dT%H:%M:%SZ" > RELEASE_DATE - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx id: buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} @@ -132,7 +167,7 @@ jobs: org.opencontainers.image.documentation=https://www.openproject.org/docs/ org.opencontainers.image.vendor=OpenProject GmbH tags: | - type=semver,pattern={{version}},value=${{ needs.extract_version.outputs.version }} + type=semver,pattern={{version}},value=${{ needs.setup.outputs.version }} images: | ${{ env.REGISTRY_IMAGE }} - name: Build image @@ -148,6 +183,8 @@ jobs: load: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} + cache-from: type=s3,blobs_prefix=cache/${{ github.repository }}/,manifests_prefix=cache/${{ github.repository }}/,region=${{ env.RUNS_ON_AWS_REGION }},bucket=${{ env.RUNS_ON_S3_BUCKET_CACHE }} + cache-to: type=s3,blobs_prefix=cache/${{ github.repository }}/,manifests_prefix=cache/${{ github.repository }}/,region=${{ env.RUNS_ON_AWS_REGION }},bucket=${{ env.RUNS_ON_S3_BUCKET_CACHE }},mode=max - name: Test # We only test the native container. If that fails the builds for the others # will be cancelled as well. @@ -176,6 +213,8 @@ jobs: BIM_SUPPORT=${{ matrix.bim_support }} labels: ${{ steps.meta.outputs.labels }} outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true + cache-from: type=s3,blobs_prefix=cache/${{ github.repository }}/,manifests_prefix=cache/${{ github.repository }}/,region=${{ env.RUNS_ON_AWS_REGION }},bucket=${{ env.RUNS_ON_S3_BUCKET_CACHE }} + cache-to: type=s3,blobs_prefix=cache/${{ github.repository }}/,manifests_prefix=cache/${{ github.repository }}/,region=${{ env.RUNS_ON_AWS_REGION }},bucket=${{ env.RUNS_ON_S3_BUCKET_CACHE }},mode=max - name: Export digest run: | mkdir -p /tmp/digests @@ -194,7 +233,7 @@ jobs: matrix: target: [slim, all-in-one] needs: - - extract_version + - setup - build steps: - name: Download digests @@ -209,7 +248,7 @@ jobs: if [ "$suffix" = "-all-in-one" ]; then suffix="" ; fi echo "suffix=$suffix" >> "$GITHUB_OUTPUT" - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Docker meta id: meta uses: docker/metadata-action@v4 @@ -223,12 +262,12 @@ jobs: latest=false suffix=${{ steps.set_suffix.outputs.suffix }} tags: | - type=semver,pattern={{version}},value=${{ needs.extract_version.outputs.version }} - type=semver,pattern={{major}}.{{minor}},value=${{ needs.extract_version.outputs.version }} - type=semver,pattern={{major}},value=${{ needs.extract_version.outputs.version }} + type=semver,pattern={{version}},value=${{ needs.setup.outputs.version }} + type=semver,pattern={{major}}.{{minor}},value=${{ needs.setup.outputs.version }} + type=semver,pattern={{major}},value=${{ needs.setup.outputs.version }} type=raw,value=dev,priority=200,enable={{is_default_branch}} - name: Login to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} @@ -240,3 +279,11 @@ jobs: - name: Inspect image run: | docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} + notify: + needs: [setup, build, merge] + if: ${{ always() && contains(needs.*.result, 'failure') }} + uses: ./.github/workflows/email-notification.yml + secrets: inherit + with: + subject: "Docker build failed" + body: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index 1aa8df4d9d35..5f97285464c4 100644 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -1,73 +1,17 @@ ARG RUBY_VERSION="3.2.3" -ARG NODE_VERSION="20.9.0" -ARG BUNDLER_VERSION="2.5.5" -ARG DEBIAN_FRONTEND=noninteractive +FROM ruby:${RUBY_VERSION}-bullseye as base +LABEL maintainer="operations@openproject.com" -# ------------------------------------- -# rubygems (private) -# ------------------------------------- -FROM ruby:${RUBY_VERSION}-bullseye as rubygems +ARG BUNDLER_VERSION="2.5.10" +ARG NODE_VERSION="20.9.0" +ARG BIM_SUPPORT=true +ENV DEBIAN_FRONTEND=noninteractive ENV BUNDLE_JOBS=8 ENV BUNDLE_RETRY=3 ENV BUNDLE_WITHOUT="development:test" -WORKDIR /app - -RUN gem install bundler --version "$BUNDLER_VERSION" --no-document - -COPY Gemfile Gemfile.modules Gemfile.lock .ruby-version ./ -COPY modules ./modules -RUN bundle install - -# ------------------------------------- -# nodejs (private) -# ------------------------------------- -# Using docker image for node so that multi-arch is automatically taken care of -FROM node:${NODE_VERSION} as nodejs - -WORKDIR /app - -COPY package.json ./ -COPY frontend/package.json frontend/package-lock.json frontend/.npmrc ./frontend/ -RUN JOBS=8 npm install - -# ------------------------------------- -# assets (private) -# ------------------------------------- -FROM rubygems as assets - -COPY --from=nodejs /usr/local/bin/node /usr/local/bin/node -COPY --from=nodejs /usr/local/lib/node_modules /usr/local/lib/node_modules -COPY --from=nodejs /usr/local/include/node /usr/local/include/node -RUN ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm - -WORKDIR /app - -COPY --from=nodejs /app/node_modules ./node_modules -COPY --from=nodejs /app/frontend/node_modules ./frontend/node_modules -COPY Rakefile . -COPY bin ./bin -COPY app ./app -COPY config ./config -COPY config/database.production.yml ./config/database.yml -COPY lib ./lib -COPY lib_static ./lib_static -COPY frontend ./frontend -COPY modules ./modules -COPY vendor ./vendor -COPY lookbook ./lookbook - -RUN --mount=type=cache,target=/app/frontend/.angular/cache,uid=1000,gid=1000 \ - SECRET_KEY_BASE=1 RAILS_ENV=production DATABASE_URL=nulldb://db \ - bin/rails openproject:plugins:register_frontend assets:precompile - -# ------------------------------------- -# base (private) -# ------------------------------------- -FROM ruby:${RUBY_VERSION}-slim-bullseye as base -LABEL maintainer="operations@openproject.com" - # SYSTEM +ENV DOCKER=1 ENV APP_USER=app ENV APP_PATH=/app ENV APP_DATA_PATH=/var/openproject/assets @@ -90,6 +34,7 @@ ENV OPENPROJECT_EDITION=standard ENV OPENPROJECT_INSTALLATION__TYPE=docker ENV OPENPROJECT_ATTACHMENTS__STORAGE__PATH=$APP_DATA_PATH/files ENV OPENPROJECT_RAILS__CACHE__STORE=file_store +ENV OPENPROJECT_ANGULAR_UGLIFY=true RUN useradd -d /home/$APP_USER -m $APP_USER RUN mkdir -p $APP_PATH && chown $APP_USER:$APP_USER $APP_PATH @@ -97,47 +42,52 @@ RUN mkdir -p $APP_DATA_PATH && chown $APP_USER:$APP_USER $APP_DATA_PATH && chmod WORKDIR $APP_PATH -RUN --mount=type=cache,target=/var/cache/apt \ - apt-get update -qq \ - && apt-get install -yq --no-install-recommends \ - file \ - curl \ - gnupg2 \ - && curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \ - && echo 'deb http://apt.postgresql.org/pub/repos/apt/ bullseye-pgdg main' > /etc/apt/sources.list.d/pgdg.list \ - && apt-get update -qq \ - && apt-get install -yq --no-install-recommends \ - libpq5 \ - postgresql-client-$CURRENT_PGVERSION \ - postgresql-client-$NEXT_PGVERSION \ - libffi7 \ - unrtf tesseract-ocr poppler-utils catdoc imagemagick \ - && apt-get purge -y curl gnupg2 \ - && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ - && truncate -s 0 /var/log/*log +# upgrade bundler +RUN gem install bundler --version "$BUNDLER_VERSION" --no-document -# ------------------------------------- -# slim (public) -# ------------------------------------- -FROM base as slim -COPY --chown=$APP_USER:$APP_USER --from=rubygems /usr/local/bundle /usr/local/bundle -COPY --chown=$APP_USER:$APP_USER --from=assets /app/public/assets /app/public/assets -COPY --chown=$APP_USER:$APP_USER --from=assets /app/config/frontend_assets.manifest.json /app/config/frontend_assets.manifest.json -COPY --chown=$APP_USER:$APP_USER . . -COPY --chown=$APP_USER:$APP_USER ./config/database.production.yml /app/config/database.yml -# Update Gemfile.lock in case a plugin has been added. It it hasn't, the file stays identical. -COPY --chown=$APP_USER:$APP_USER --from=rubygems /app/Gemfile.lock /app/ +# system dependencies, nodejs +COPY ./docker/prod/setup/preinstall-common.sh ./docker/prod/setup/preinstall-common.sh +RUN ./docker/prod/setup/preinstall-common.sh + +# stuff required for gems +COPY Gemfile Gemfile.* .ruby-version ./ +COPY modules ./modules +COPY vendor ./vendor +# some gemspec files of plugins require files in there, notably OpenProject::Version +COPY lib ./lib + +RUN \ + bundle config set --local path 'vendor/bundle' && \ + bundle config set --local without 'test development' && \ + bundle install --quiet --no-cache --jobs=8 --retry=3 && \ + bundle config set deployment 'true' && \ + cp Gemfile.lock Gemfile.lock.bak && \ + rm -rf vendor/bundle/ruby/*/cache && \ + rm -rf vendor/bundle/ruby/*/gems/*/spec && \ + rm -rf vendor/bundle/ruby/*/gems/*/test -ENV BUNDLE_FROZEN=true +COPY . . + +# Copy lock file again as the updated version was overriden by COPY just now +RUN cp Gemfile.lock.bak Gemfile.lock && rm Gemfile.lock.bak + +RUN ./docker/prod/setup/precompile-assets.sh +RUN ./docker/prod/setup/postinstall-common.sh # We need this so puma is allowed to create the tmp/pids folder and # temporary upload files when running with a uid other than 1000 (app) # but with an allowed supplemental group (1000). RUN tmp_path=$APP_PATH/tmp; (mkdir -p $tmp_path || true) && chown $APP_USER:$APP_USER $tmp_path && chmod g+rw $tmp_path -USER $APP_USER +RUN cp ./config/database.production.yml config/database.yml RUN ln -s $APP_PATH/docker/prod/setup/.irbrc /home/$APP_USER/ +# ------------------------------------- +# slim (public) +# ------------------------------------- +FROM base as slim + +USER $APP_USER EXPOSE 8080 CMD ["./docker/prod/web"] VOLUME ["$APP_DATA_PATH"] @@ -146,61 +96,16 @@ VOLUME ["$APP_DATA_PATH"] # all-in-one (public) # ------------------------------------- FROM base as all-in-one -ARG DEBIAN_FRONTEND -ARG NODE_VERSION -ARG BUNDLER_VERSION -# Allow platform-specific additions. Valid values are: on-prem,saas,bahn -ARG PLATFORM=on-prem -# Use OAuth token in case private gems need to be fetched -ARG GITHUB_OAUTH_TOKEN -ARG BIM_SUPPORT=true -ARG GOSU_VERSION="1.17" -ARG OPENPROJECT_ANGULAR_UGLIFY=true ENV OPENPROJECT_RAILS__CACHE__STORE=memcache ENV DATABASE_URL=postgres://openproject:openproject@127.0.0.1/openproject ENV PGDATA=/var/openproject/pgdata -ENV PGBIN="/usr/lib/postgresql/$PGVERSION/bin" - -COPY docker/prod/setup ./docker/prod/setup -RUN ./docker/prod/setup/preinstall.sh +ARG GOSU_VERSION="1.17" -RUN dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \ - && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" \ - && chmod +x /usr/local/bin/gosu \ - && gosu nobody true +RUN ./docker/prod/setup/postinstall-onprem.sh -# set irb default config for app (docker run -it ...) and root (docker exec -it ...) users -RUN ln -s /app/docker/prod/setup/.irbrc /home/$APP_USER/ RUN ln -s /app/docker/prod/setup/.irbrc /root/ -COPY Gemfile Gemfile.* .ruby-version ./ -COPY modules ./modules -COPY vendor ./vendor -# some gemspec files of plugins require files in there, notably OpenProject::Version -COPY lib ./lib - -RUN \ - bundle config set --local path 'vendor/bundle' && \ - bundle config set --local without 'test development' && \ - bundle install --quiet --no-cache --jobs=8 --retry=3 && \ - bundle config set deployment 'true' && \ - cp Gemfile.lock Gemfile.lock.bak && \ - rm -rf vendor/bundle/ruby/*/cache && \ - rm -rf vendor/bundle/ruby/*/gems/*/spec && \ - rm -rf vendor/bundle/ruby/*/gems/*/test - -# Finally, copy over the whole thing -COPY . . - -# Copy lock file again as the updated version was overriden by COPY just now -RUN cp Gemfile.lock.bak Gemfile.lock && rm Gemfile.lock.bak - -RUN ./docker/prod/setup/postinstall.sh - -# this has to happen after postinstall.sh since it uses a different database.yml -COPY config/database.production.yml ./config/database.yml - # Expose ports for apache and postgres EXPOSE 80 5432 diff --git a/docker/prod/setup/postinstall-common.sh b/docker/prod/setup/postinstall-common.sh index ead33f2ff9c3..3da98edb802a 100755 --- a/docker/prod/setup/postinstall-common.sh +++ b/docker/prod/setup/postinstall-common.sh @@ -1,50 +1,8 @@ #!/bin/bash +set -eox pipefail -set -e -set -o pipefail +# Ensure we can write in /tmp/op_uploaded_files (cf. #29112) +mkdir -p /tmp/op_uploaded_files/ && chown -R $APP_USER:$APP_USER /tmp/op_uploaded_files/ -pushd "${APP_PATH}/frontend" - -export NG_CLI_ANALYTICS=ci # so angular cli doesn't block waiting for user input - -# Installing frontend dependencies -npm install - -popd - -# Bundle assets - -su - postgres -c "$PGBIN/initdb -D /tmp/nulldb" -su - postgres -c "$PGBIN/pg_ctl -D /tmp/nulldb -l /dev/null -l /tmp/nulldb/log -w start" - -# give some more time for DB to start -sleep 5 - -echo "create database assets; create user assets with encrypted password 'p4ssw0rd'; grant all privileges on database assets to assets;" | su - postgres -c psql - -# dump schema -DATABASE_URL=postgres://assets:p4ssw0rd@127.0.0.1/assets RAILS_ENV=production bundle exec rake db:migrate db:schema:dump db:schema:cache:dump - -# this line requires superuser rights, which is not always available and doesn't matter anyway -sed -i '/^COMMENT ON EXTENSION/d' db/structure.sql - -# precompile assets -DATABASE_URL=postgres://assets:p4ssw0rd@127.0.0.1/assets RAILS_ENV=production bundle exec rake assets:precompile - -su - postgres -c "$PGBIN/pg_ctl -D /tmp/nulldb stop" - -rm -rf /tmp/nulldb - -# Remove sprockets cache -rm -rf "$APP_PATH/tmp/cache/assets" - -# Remove node_modules and entire frontend -rm -rf "$APP_PATH/node_modules/" "$APP_PATH/frontend/node_modules/" - -# Remove angular cache -rm -rf "$APP_PATH/frontend/.angular" - -# Clean cache in root -rm -rf /root/.npm - -rm -f "$APP_PATH/log/production.log" +# Remove any existing config/database.yml +rm -f ./config/database.yml \ No newline at end of file diff --git a/docker/prod/setup/postinstall-onprem.sh b/docker/prod/setup/postinstall-onprem.sh new file mode 100755 index 000000000000..ec4160ce7bde --- /dev/null +++ b/docker/prod/setup/postinstall-onprem.sh @@ -0,0 +1,43 @@ +#!/bin/bash +set -eox pipefail + + +# postfix.postinst tries to generate a hostname based on /etc/resolv.conf, which +# gets copied in to the docker environment from the host system. On systems +# that are not on a network with a domain, this will result in a failed install. +# +# See https://salsa.debian.org/postfix-team/postfix-dev/-/blob/debian/buster-updates/debian/postfix.postinst#L40 +if [ -f /run/.containerenv -o -f /.dockerenv ]; then + mv /bin/hostname /bin/x-hostname + echo openproject.local > /etc/hostname + apt-get install -y postfix + mv /bin/x-hostname /bin/hostname +fi + +apt-get update -qq +# embed all-in-one additional software +apt-get install -y \ + postgresql-$CURRENT_PGVERSION \ + postgresql-$NEXT_PGVERSION \ + memcached \ + postfix \ + apache2 \ + supervisor \ + git subversion \ + wget + +# remove any existing cluster +service postgresql stop +rm -rf /var/lib/postgresql/{$CURRENT_PGVERSION,$NEXT_PGVERSION} + +a2enmod proxy proxy_http +rm -f /etc/apache2/sites-enabled/000-default.conf + +# gosu +dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" +wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" +chmod +x /usr/local/bin/gosu +gosu nobody true + +rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +truncate -s 0 /var/log/*log diff --git a/docker/prod/setup/precompile-assets.sh b/docker/prod/setup/precompile-assets.sh new file mode 100755 index 000000000000..663b32b61034 --- /dev/null +++ b/docker/prod/setup/precompile-assets.sh @@ -0,0 +1,25 @@ +#!/bin/bash +set -exo pipefail + +if [ -f config/frontend_assets.manifest.json ]; then + echo "Assets have already been precompiled. Reusing." +else + echo "Assets need to be compiled" + JOBS=8 npm install + + SECRET_KEY_BASE=1 RAILS_ENV=production DATABASE_URL=nulldb://db \ + bin/rails openproject:plugins:register_frontend assets:precompile + + if [ "$DOCKER" = "1" ]; then + rm -rf /tmp/nulldb + # Remove sprockets cache + rm -rf "$APP_PATH/tmp/cache/assets" + # Remove node_modules and entire frontend + rm -rf "$APP_PATH/node_modules/" "$APP_PATH/frontend/node_modules/" + # Remove angular cache + rm -rf "$APP_PATH/frontend/.angular" + # Clean cache in root + rm -rf /root/.npm + rm -f "$APP_PATH/log/production.log" + fi +fi \ No newline at end of file diff --git a/docker/prod/setup/preinstall-common.sh b/docker/prod/setup/preinstall-common.sh index 3a9b092d43f8..ee5569141d3c 100755 --- a/docker/prod/setup/preinstall-common.sh +++ b/docker/prod/setup/preinstall-common.sh @@ -19,51 +19,56 @@ get_architecture() { return 0 } -set -e -set -o pipefail +set -exo pipefail ARCHITECTURE=$(get_architecture) apt-get update -qq -apt-get install -y git subversion wget curl gnupg2 apt-transport-https unzip build-essential libpq-dev libclang-dev +# make sure all dependencies are up to date +apt-get upgrade -y + +apt-get install -yq --no-install-recommends \ + file \ + curl \ + gnupg2 \ # install node + npm curl -s https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${ARCHITECTURE}.tar.gz | tar xzf - -C /usr/local --strip-components=1 -wget --quiet -O- https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - -echo "deb http://apt.postgresql.org/pub/repos/apt bullseye-pgdg main" > /etc/apt/sources.list.d/pgdg.list - -if [ ! "$BIM_SUPPORT" = "false" ]; then - # https://learn.microsoft.com/en-gb/dotnet/core/install/linux-debian#debian-11 - wget --quiet https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O /tmp/packages-microsoft-prod.deb && \ - dpkg -i /tmp/packages-microsoft-prod.deb && rm /tmp/packages-microsoft-prod.deb -fi +curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - +echo 'deb http://apt.postgresql.org/pub/repos/apt/ bullseye-pgdg main' > /etc/apt/sources.list.d/pgdg.list apt-get update -qq -apt-get install -y \ - poppler-utils \ +apt-get install -yq --no-install-recommends \ + libpq-dev \ + postgresql-client-$CURRENT_PGVERSION \ + postgresql-client-$NEXT_PGVERSION \ + libpq5 \ + libffi7 \ unrtf \ tesseract-ocr \ + poppler-utils \ catdoc \ - postgresql-9.6 \ - postgresql-client-9.6 \ - postgresql-13 \ - postgresql-client-13 \ imagemagick \ - memcached + libclang-dev -# remove any existing cluster -service postgresql stop -rm -rf /var/lib/postgresql/{9.6,13} # Specifics for BIM edition if [ ! "$BIM_SUPPORT" = "false" ]; then + apt-get install -y wget unzip + + # https://learn.microsoft.com/en-gb/dotnet/core/install/linux-debian#debian-11 + wget --quiet https://packages.microsoft.com/config/debian/11/packages-microsoft-prod.deb -O /tmp/packages-microsoft-prod.deb + dpkg -i /tmp/packages-microsoft-prod.deb + rm /tmp/packages-microsoft-prod.deb + + apt-get update -qq apt-get install -y dotnet-runtime-6.0 # required for BIM edition tmpdir=$(mktemp -d) cd $tmpdir # Install XKT converter - npm install @xeokit/xeokit-gltf-to-xkt@1.3.1 -g + npm install -g @xeokit/xeokit-gltf-to-xkt@1.3.1 # Install COLLADA2GLTF wget --quiet https://github.com/KhronosGroup/COLLADA2GLTF/releases/download/v2.1.5/COLLADA2GLTF-v2.1.5-linux.zip @@ -85,6 +90,8 @@ if [ ! "$BIM_SUPPORT" = "false" ]; then rm -rf $tmpdir fi -gem install bundler --version "$BUNDLER_VERSION" --no-document - id $APP_USER || useradd -d /home/$APP_USER -m $APP_USER + +rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +truncate -s 0 /var/log/*log + From 4d6a0a7967e1743d8d9fb39f4a0746cbd5c93455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Wed, 8 May 2024 14:00:08 +0200 Subject: [PATCH 05/10] Add missing notification --- .github/workflows/email-notification.yml | 38 ++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/workflows/email-notification.yml diff --git a/.github/workflows/email-notification.yml b/.github/workflows/email-notification.yml new file mode 100644 index 000000000000..9e9799ad1ff6 --- /dev/null +++ b/.github/workflows/email-notification.yml @@ -0,0 +1,38 @@ +name: email-notification + +on: + workflow_call: + inputs: + subject: + type: string + required: true + body: + type: string + required: true + from: + type: string + default: Github CI + to: + type: string + default: operations@openproject.com + secrets: + OPS_MAIL_SMTP_TOKEN: + required: true + +jobs: + notify: + name: Notify + runs-on: ubuntu-latest + steps: + - name: Send mail + uses: dawidd6/action-send-mail@v3 + with: + subject: ${{ inputs.subject }} + body: ${{ inputs.body }} + from: ${{ inputs.from }} + to: ${{ inputs.to }} + secure: false + server_port: 587 + server_address: smtp.postmarkapp.com + username: PM-T-outbound-bw6Xf6uoKnU76g1RcuydgZ + password: ${{secrets.OPS_MAIL_SMTP_TOKEN }} From d516071297af7df342f179ca5eac2ffd47a568cb Mon Sep 17 00:00:00 2001 From: Markus Kahl Date: Wed, 8 May 2024 14:51:58 +0100 Subject: [PATCH 06/10] fix ldap group sync job schedule --- modules/ldap_groups/lib/open_project/ldap_groups/engine.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ldap_groups/lib/open_project/ldap_groups/engine.rb b/modules/ldap_groups/lib/open_project/ldap_groups/engine.rb index 6523f93db6f4..0296a0bb454f 100644 --- a/modules/ldap_groups/lib/open_project/ldap_groups/engine.rb +++ b/modules/ldap_groups/lib/open_project/ldap_groups/engine.rb @@ -22,7 +22,7 @@ class Engine < ::Rails::Engine add_cron_jobs do { "LdapGroups::SynchronizationJob": { - cron: "30 23 * * *", # Run once per night at 11:30pm + cron: "*/30 * * * *", # Run every 30 minutes class: LdapGroups::SynchronizationJob.name } } From ac161812b74eb0b340e485c96cdd2ad04a1c66a0 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Wed, 8 May 2024 16:15:33 +0000 Subject: [PATCH 07/10] update locales from crowdin [ci skip] --- config/locales/crowdin/js-ms.yml | 152 ++++++------ config/locales/crowdin/ms.yml | 232 +++++++++--------- .../config/locales/crowdin/de.yml | 10 +- .../config/locales/crowdin/js-de.yml | 4 +- .../config/locales/crowdin/ms.yml | 4 +- .../config/locales/crowdin/js-ms.yml | 12 +- .../config/locales/crowdin/ms.yml | 2 +- 7 files changed, 208 insertions(+), 208 deletions(-) diff --git a/config/locales/crowdin/js-ms.yml b/config/locales/crowdin/js-ms.yml index c038ef2ab3b9..9a9b7abc87f2 100644 --- a/config/locales/crowdin/js-ms.yml +++ b/config/locales/crowdin/js-ms.yml @@ -23,14 +23,14 @@ ms: js: ajax: hide: "Sembunyikan" - loading: "Loading…" + loading: "Memuatkan..." updating: "Mengemas kini..." attachments: delete: "Padam lampiran" delete_confirmation: | Adakah anda pasti anda ingin memadam fail ini? Tindakan ini tidak boleh dikembalikan. draggable_hint: | - Drag on editor field to inline image or reference attachment. Closed editor fields will be opened while you keep dragging. + Tarik ruang pengedit ke imej sebaris atau lampiran rujukan. Ruang pengedit yang ditutup akan dibuka sambil anda menariknya. quarantined_hint: "Fail ini telah dikuarantin kerana virus ditemui. Ia tidak tersedia untuk dimuat turun." autocomplete_ng_select: add_tag: "Tambah item" @@ -45,7 +45,7 @@ ms: remove: "Keluarkan %{name}" active: "%{name} %{label} aktif " backup: - attachments_disabled: Attachments may not be included since they exceed the maximum overall size allowed. You can change this via the configuration (requires a server restart). + attachments_disabled: Lampiran tidak akan dimasukkan kerana ia melebihi saiz kesuluruhan maksimum yang dibenarkan. Anda boleh mengubahnya melalui konfigurasi (memerlukan server untuk dimulakan semula). info: > Anda boleh meminta sokongan disini. Proses akan mengambil sedikit masa bergantung kepada jumlah data (terutamanya lampiran) anda ada. Anda akan menerima e-mel apabila ianya sedia. note: > @@ -84,7 +84,7 @@ ms: button_filter: "Penyaring" button_collapse_all: "Sembunyikan semua" button_expand_all: "Kembangkan semua" - button_advanced_filter: "Advanced filter" + button_advanced_filter: "Penyaringan lanjutan" button_list_view: "Paparan senarai" button_show_view: "Pandangan skrin penuh" button_log_time: "Masa log" @@ -92,12 +92,12 @@ ms: button_open_details: "Buka paparan butiran" button_close_details: "Tutup paparan butiran" button_open_fullscreen: "Buka paparan skrin penuh" - button_show_cards: "Show card view" + button_show_cards: "Tunjukkan paparan kad" button_show_list: "Tunjukkan paparan senarai" button_show_table: "Tunjukkan paparan jadual" button_show_gantt: "Tunjukkan paparan Gantt" button_show_fullscreen: "Tunjuk paparan skrin penuh" - button_more_actions: "More actions" + button_more_actions: "Tindakan lebih lanjut" button_quote: "Sebut harga" button_save: "Simpan" button_settings: "Tetapan" @@ -109,7 +109,7 @@ ms: card: add_new: "Tambah kad baharu" highlighting: - inline: "Highlight inline:" + inline: "Serlahkan barisan:" entire_card_by: "Keseluruhan kad dengan" remove_from_list: "Keluarkan kad dari senarai" caption_rate_history: "Sejarah kadar" @@ -154,16 +154,16 @@ ms: child_pages: button: "Pautkan ke halaman anak" include_parent: "Termasuk induk" - text: "[Placeholder] Links to child pages of" + text: "[Pengguna sementara] pautan ke halaman anak" page: "Halaman wiki" this_page: "halaman ini" hint: | - Leave this field empty to list all child pages of the current page. If you want to reference a different page, provide its title or slug. + Tinggalkan ruangan ini untuk senaraikan halaman-halaman anak daripada halaman semasa. Jika anda ingin merujuk ke halaman berbeza, sediakan tajuk atau slug. code_block: - button: "Insert code snippet" + button: "Masukkan kod potongan" title: "Masukkan / sunting snippet Code" language: "Bahasa pemformatan" - language_hint: "Enter the formatting language that will be used for highlighting (if supported)." + language_hint: "Masukkan pemformatan bahasa yang akan digunakan untuk penyerlahan (jika disokong)." dropdown: macros: "Macros" chose_macro: "Pilih macro" @@ -171,7 +171,7 @@ ms: toolbar_help: "Klik untuk memilih widget dan tunjuk toolbar. Klik dua kali untuk sunting widget." wiki_page_include: button: "Sertakan kandungan halaman wiki lain" - text: "[Placeholder] Included wiki page of" + text: "[Pengguna sementara] Termasuk halaman wiki" page: "Halaman wiki" not_set: "(Halaman belum ditetapkan lagi)" hint: | @@ -185,10 +185,10 @@ ms: without_type: "Cipta pakej kerja" with_type: "Cipta pakej kerja (Jenis: %{typename})" embedded_table: - button: "Embed work package table" - text: "[Placeholder] Embedded work package table" + button: "Gabungkan rajah pakej kerja " + text: "[Sementara] Jadual pakej kerja yang tersemat" embedded_calendar: - text: "[Placeholder] Embedded calendar" + text: "[Sementara] Kalendar yang tersemat" admin: type_form: custom_field: "Medan tersuai" @@ -245,9 +245,9 @@ ms: installation: "Bantuan pemasangan" installation_text: "Jurutera perisian berpengalaman membimbing anda melalui pemasangan lengkap dan proses persediaan dalam infrastruktur anda sendiri." premium_features: "Tambahan Enterprise" - premium_features_text: "Agile boards, custom theme and logo, graphs, intelligent workflows with custom actions, full text search for work package attachments and multi-select custom fields." + premium_features_text: "Papan Agile, tema tersuai dan logo, graf, aliran kerja yang cerdas dengan tindakan tersuai, carian teks penuh untuk lampiran pakej kerja dan pelbagai pilihan medan tersuai." professional_support: "Bantuan profesional" - professional_support_text: "Get reliable, high-touch support from senior support engineers with expert knowledge about running OpenProject in business-critical environments." + professional_support_text: "Dapatkan sokongan yang boleh dipercayai, sentuhan tinggi daripada jurutera sokongan kanan dengan pengetahuan pakar tentang menjalankan OpenProject dalam persekitaran perniagaan yang kritikal." button_start_trial: "Mulakan percubaan percuma" button_upgrade: "Naik taraf sekarang" button_contact_us: "Hubungi kami untuk demo" @@ -282,7 +282,7 @@ ms: internal: "Sebuah ralat dalaman telah berlaku." cannot_save_changes_with_message: "Tidak dapat menyimpan perubahan anda kerana ralat tersebut: %{error}" query_saving: "Paparan tersebut tidak dapat disimpan." - embedded_table_loading: "The embedded view could not be loaded: %{message}" + embedded_table_loading: "Paparan yang tersemat tidak dapat dimuatkan: %{message}" enumeration_activities: "Aktiviti (penjejakan masa)" enumeration_doc_categories: "Kategori dokumen" enumeration_work_package_priorities: "Keutamaan pakej kerja" @@ -290,7 +290,7 @@ ms: more_values_not_shown: "Terdapat %{total} lagi hasil, cari untuk menapis hasil." description: text_open_filter: "Buka penyaring ini dengan 'ALT' dan kekunci anak panah." - text_close_filter: "To select an entry leave the focus for example by pressing enter. To leave without filter select the first (empty) entry." + text_close_filter: "Untuk memilih satu kemasukan, tinggalkan fokus, contohnya dengan menekan enter. Untuk keluar tanpa penyaringan, pilih kemasukan pertama (kosong)." noneElement: "(tiada)" time_zone_converted: two_values: "%{from} - %{to} dalam masa tempatan anda." @@ -312,7 +312,7 @@ ms: right: "Kanan" farRight: "Paling kanan" description: > - Select the attributes you want to be shown in the respective positions of the Gantt chart at all times. Note that when hovering over an element, its date labels will be shown instead of these attributes. + Pilih atribut yang anda ingin tunjukkan dalam kedudukan berkaitan carta Gantt pada setiap masa. Ambil perhatian bahawa apabila hover di atas elemen, label tarikhnya akan ditunjukkan dan bukannya atribut ini. button_activate: "Tunjukkan carta Gantt" button_deactivate: "Sembunyikan carta Gantt" filter: @@ -336,7 +336,7 @@ ms: general_text_Yes: "Ya" hal: error: - update_conflict_refresh: "Click here to refresh the resource and update to the newest version." + update_conflict_refresh: "Klik sini untuk muat semula sumber dan kemas kini versi yang terbaru." edit_prohibited: "Penyuntingan %{attribute} disekat untuk sumber ini. Sama ada atribut ini diperolehi daripada hubungan (cth, anak) atau sebaliknya tidak boleh dikonfigurasikan." format: date: "%{attribute} bukan tarikh yang sah - dijangka TTTT-BB-HH." @@ -363,7 +363,7 @@ ms: token_name_description_text: 'Jika anda melanggan ke kalendar ini dari pelbagai peranti, nama ini akan membantu anda membezakan antara mereka dalam senarai token akses anda.' copy_url_label: "Salin URL" ical_generation_error_text: "Ralat berlaku semasa menjana URL kalendar." - success_message: 'The URL "%{name}" was successfully copied to your clipboard. Paste it in your calendar client to complete the subscription.' + success_message: '"%{name}" URL berjaya disalin ke papan klip anda. Sisipkan ia dalam kalendar pelanggan anda untuk lengkapkan langganan.' label_activate: "Aktifkan" label_assignee: "Wakil" label_add_column_after: "Tambah kolum selepas" @@ -387,7 +387,7 @@ ms: label_board: "Papan" label_board_locked: "Terkunci" label_board_plural: "Papan-papan" - label_board_sticky: "Sticky" + label_board_sticky: "Pelekat" label_change: "Ubah " label_create: "Cipta" label_create_work_package: "Cipta pakej kerja baharu" @@ -406,7 +406,7 @@ ms: label_collapse_all: "Sembunyikan semua" label_comment: "Komen" label_committed_at: "%{committed_revision_link} pada %{date}" - label_committed_link: "committed revision %{revision_identifier}" + label_committed_link: "Semakan yang dilakukan %{revision_identifier}" label_contains: "mengandungi" label_created_on: "dicipta pada" label_edit_comment: "Sunting komen ini" @@ -427,7 +427,7 @@ ms: label_group: "Kumpulan" label_group_by: "Kumpulkan mengikut" label_group_plural: "Kumpulan" - label_hide_attributes: "Show less" + label_hide_attributes: "Kurangkan" label_hide_column: "Sembunyikan lajur" label_hide_project_menu: "Sembunyikan menu projek" label_in: "dalam" @@ -592,7 +592,7 @@ ms: calendar: "Papan perancangan mingguan atau dua mingguan memaparkan semua pakej kerja ditugaskan ke ahli pasukan anda." add_assignee: "Untuk memulakan, tambah penerima tugasan ke dalam perancang pasukan." add_existing: "Cari pakej kerja sedia ada dan tarik mereka ke perancang pasukan untuk serta merta tugaskan mereka ke ahli pasukan dan tentukan tarikh mula dan akhir." - card: "Drag work packages horizontally to move them backwards or forwards in time, drag the edges to change start and end dates and even drag them vertically to a different row to assign them to another member." + card: "Tarik pakej kerja secara mendatar untuk gerakkan mereka ke belakang atau ke hadapan dalam masa, tarik pinggir pakej kerja untuk mengubah tarikh mula dan akhir malah, tarik secara menegak ke baris berbeza untuk tugaskan mereka ke ahli yang lain." notifications: title: "Pemberitahuan" no_unread: "Tiada notifikasi belum dibaca" @@ -686,7 +686,7 @@ ms: title: "Menyertai" description: "Pemberitahuan untuk semua aktiviti dalam pakej kerja yang anda terlibat (wakil, bertanggungjawab, atau pemerhati)." delayed: - title: "Non-participating" + title: "Tidak menyertai" description: "Pemberitahuan tambahan untuk aktiviti dalam semua projek." date_alerts: title: "Peringatan tarikh" @@ -764,15 +764,15 @@ ms: attribute_groups: error_duplicate_group_name: "Nama %{group} digunakan lebih dari sekali. Nama kumpulan mesti unik." error_no_table_configured: "Sila konfigurasi jadual untuk %{group}." - reset_title: "Reset form configuration" + reset_title: "Set semula konfigurasi borang" confirm_reset: > - Warning: Are you sure you want to reset the form configuration? This will reset the attributes to their default group and disable ALL custom fields. - upgrade_to_ee: "Upgrade to Enterprise on-premises edition" + Amaran: Adakah anda pasti anda ingin set semula konfigurasi borang? Ini akan set semula atribut ke kumpulan asal mereka dan menyahdayakan SEMUA medan tersuai. + upgrade_to_ee: "Naik taraf edisi Enterprise di premis" upgrade_to_ee_text: "Wow! Jika anda perlukan tambahan ini anda adalah super pro! Bolehkah anda menyokong kami pemaju OpenProject dengan menjadi pelanggan edisi Enterprise?" more_information: "Maklumat lanjut" nevermind: "Tidak mengapa" edit: - form_configuration: "Form Configuration" + form_configuration: "Konfigurasi Borang" projects: "Projek" settings: "Tetapan" time_entry: @@ -794,15 +794,15 @@ ms: label_search_watchers: Cari pemerhati label_add: Tambah pemerhati label_discard: Buang pemilihan - typeahead_placeholder: Search for possible watchers + typeahead_placeholder: Cari pemerhati yang mungkin relation_labels: parent: "Induk" children: "Anak" relates: "Berkaitan Dengan" duplicates: "Duplikasi" duplicated: "Duplikasi oleh" - blocks: "Blocks" - blocked: "Blocked by" + blocks: "Sekat" + blocked: "Disekat oleh" precedes: "Mendahului" follows: "Mengikuti" includes: "Termasuk" @@ -818,8 +818,8 @@ ms: set_parent: "Tetapkan induk" change_parent: "Ubah induk" remove_parent: "Keluarkan induk" - hierarchy_indent: "Indent hierarchy" - hierarchy_outdent: "Outdent hierarchy" + hierarchy_indent: "Hierarki inden" + hierarchy_outdent: "Hierarki outdent" group_by_wp_type: "Kumpulkan mengikut jenis pakej" group_by_relation_type: "Kumpulkan mengikut jenis perhubungan" add_parent: "Tambah induk sedia ada" @@ -827,7 +827,7 @@ ms: create_new: "Cipta baru" add_existing: "Tambah sedia ada" add_existing_child: "Tambah anak sedia ada" - remove_child: "Remove child" + remove_child: "Padam anak" add_new_relation: "Cipta perhubungan baru" add_existing_relation: "Tambah perhubungan sedia ada" update_description: "Tetapkan atau kemas kini penerangan perhubungan ini" @@ -858,7 +858,7 @@ ms: sorted_asc: "Susunan menaik digunakan, " sorted_dsc: "Susunan menurun digunakan, " sorted_no: "Tiada susunan digunakan, " - sorting_disabled: "sorting is disabled" + sorting_disabled: "penyusunan dinyahaktifkan" activate_asc: "aktifkan untuk gunakan penyusunan menaik" activate_dsc: "aktifkan untuk gunakan penyusunan menurun" activate_no: "aktifkan untuk membuang penyusunan" @@ -868,29 +868,29 @@ ms: zooms: "Tahap zum" outlines: "Tahap hierarki" upsale: - ee_only: "Enterprise edition add-on" + ee_only: "Tambahan edisi Enterprise" wiki_formatting: strong: "Kuat" italic: "Italic" - underline: "Underline" - deleted: "Deleted" - code: "Inline Code" + underline: "Gariskan" + deleted: "Padamkan" + code: "Kod sebaris" heading1: "Tajuk 1" heading2: "Tajuk 2" heading3: "Tajuk 3" unordered_list: "Senarai tidak tersusun" ordered_list: "Senarai tersusun" quote: "Petikan harga" - unquote: "Unquote" - preformatted_text: "Preformatted Text" + unquote: "Batalkan petikan" + preformatted_text: "Teks yang telah diformatkan" wiki_link: "Pautan ke halaman wiki" image: "Gambar" work_packages: bulk_actions: move: "Perubahan projek secara pukal" - edit: "Bulk edit" - copy: "Bulk copy" - delete: "Bulk delete" + edit: "Edit pukal" + copy: "Salinan pukal" + delete: "Penghapusan pukal" button_clear: "Kosongkan" comment_added: "Komen telah berjaya ditambahkan." comment_send_failed: "Ralat telah berlaku. Tidak dapat menghantar komen." @@ -916,7 +916,7 @@ ms: label_filter_add: "Tambah penyaring" label_filter_by_text: "Saring mengikut teks" label_options: "Pilihan" - label_column_multiselect: "Combined dropdown field: Select with arrow keys, confirm selection with enter, delete with backspace" + label_column_multiselect: "Medan drop-down digabungkan: Pilih dengan kekunci anak panah, sahkan pemilihan dengan enter, padam dengan backspace" message_error_during_bulk_delete: Ralat berlaku semasa cuba untuk memadam pakej kerja. message_successful_bulk_delete: Berjaya memadamkan pakej kerja. message_successful_show_in_fullscreen: "Klik di sini untuk buka pakej kerja ini dalam paparan skrin penuh." @@ -950,15 +950,15 @@ ms: hide: "Sembunyikan mod hierarki" toggle_button: "Klik untuk tukar mod hierarki." leaf: "Dedaun pakej kerja pada tahap %{level}." - children_collapsed: "Hierarchy level %{level}, collapsed. Click to show the filtered children" - children_expanded: "Hierarchy level %{level}, expanded. Click to collapse the filtered children" + children_collapsed: "Paras hierarki %{level}, ditutup. Klik untuk tunjuk anak yang disaring" + children_expanded: "Paras hierarki %{level}, dikembangkan. Klik untuk tutup anak yang disaring" faulty_query: title: Pakej kerja tidak dapat dimuatkan. description: Paparan anda salah dan tidak dapat untuk diproses. no_results: title: Tiada pakej kerja untuk dipaparkan. - description: Either none have been created or all work packages are filtered out. - limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting. + description: Sama ada tiada yang dicipta atau semua pakej kerja telah disaring keluar. + limited_results: Hanya %{count} pakej kerja boleh ditunjukkan dalam mod penyusunan manual. Sila kurangkan hasil dengan menyaring, atau tukar ke penyusunan secara automatik. property_groups: details: "Butiran" people: "Orang" @@ -1030,11 +1030,11 @@ ms: rename_query_placeholder: "Nama paparan ini" star_text: "Tandakan paparan ini sebagai kegemaran dan tambah ke bar sisi pandangan yang disimpan di sisi kiri." public_text: > - Publish this view, allowing other users to access your view. Users with the 'Manage public views' permission can modify or remove public query. This does not affect the visibility of work package results in that view and depending on their permissions, users may see different results. + Terbitkan paparan ini, membenarkan pengguna lain untuk akses paparan anda. Pengguna dengan kebenaran 'Urus paparan awam' boleh ubah suai atau keluarkan pertanyaan awam. Ini tidak akan mempengaruhi keterlihatan hasil pakej kerja dalam paparan itu dan bergantung kepada kebenaran mereka, pengguna mungkin melihat hasil yang berbeza. errors: unretrievable_query: "Tidak dapat untuk mendapatkan paparan dari URL" not_found: "Tiada paparan seperti itu" - duplicate_query_title: "Name of this view already exists. Change anyway?" + duplicate_query_title: "Nama paparan ini sudah wujud. Tukar juga?" text_no_results: "Tiada paparan yang sepadan yang dijumpai." scheduling: is_parent: "Tarikh pakej kerja ini disimpulkan secara automatik dari anaknya. Aktifkan 'Penjadualan Manual' untuk tetapkan tarikh." @@ -1042,35 +1042,35 @@ ms: sharing: share: "Kongsi" title: "Kongsi pakej kerja" - show_all_users: "Show all shared users" + show_all_users: "Tunjuk semua pengguna kongsi" selected_count: "%{count} dipilih" selection: - mixed: "Mixed" + mixed: "Bercampur" upsale: description: "Kongsi pakej kerja dengan pengguna yang bukan ahli projek." table: configure_button: "Konfigurasi jadual pakej kerja" summary: "Jadual dengan baris pakej kerja dan kolum atribut pakej kerja." - text_inline_edit: "Most cells of this table are buttons that activate inline-editing functionality of that attribute." - text_sort_hint: "With the links in the table headers you can sort, group, reorder, remove and add table columns." - text_select_hint: "Select boxes should be opened with 'ALT' and arrow keys." + text_inline_edit: "Kebanyakan sel jadual ini ialah butang yang mengaktifkan kefungsian pengeditan sebaris bagi atribut tersebut." + text_sort_hint: "Dengan pautan dalam pengepala jadual anda boleh menyusun, mengumpul, menyusun semula, mengeluar dan menambahkan kolum jadual." + text_select_hint: "Pilih kotak yang sepatutnya dibuka dengan 'ALT' dan kekunci anak panah." table_configuration: button: "Konfigurasi jadual pakej kerja ini" choose_display_mode: "Papar pakej kerja sebagai" - modal_title: "Work package table configuration" - embedded_tab_disabled: "This configuration tab is not available for the embedded view you are editing." + modal_title: "Konfigurasi jadual pakej kerja" + embedded_tab_disabled: "Tab konfigurasi ini tidak tersedia untuk paparan tersemat yang anda sedang sunting." default: "default" display_settings: "Tetapan paparan" - default_mode: "Flat list" + default_mode: "Senarai datar" hierarchy_mode: "Hierarki" - hierarchy_hint: "All filtered table results will be augmented with their ancestors. Hierarchies can be expanded and collapsed." - display_sums_hint: "Display sums of all summable attributes in a row below the table results." - show_timeline_hint: "Show an interactive gantt chart on the right side of the table. You can change its width by dragging the divider between table and gantt chart." - highlighting: "Highlighting" + hierarchy_hint: "Semua hasil jadual tersaring akan ditambah bersama leluhur mereka. Hierarki boleh dikembangkan dan ditutup." + display_sums_hint: "Paparkan jumlah semua atribut yang boleh dijumlahkan dalam baris di bawah hasil jadual." + show_timeline_hint: "Tunjuk satu carta gantt yang interaktif pada bahagian kanan jadual. Anda boleh ubah lebar nya dengan menarik pembahagi antara jadual dan carta gantt." + highlighting: "Menyerlahkan" highlighting_mode: - description: "Highlight with color" - none: "No highlighting" - inline: "Highlighted attribute(s)" + description: "Serlahkan dengan warna" + none: "Tiada penyerlahan" + inline: "Atribut yang diserlahkan" inline_all: "Semua atribut" entire_row_by: "Keseluruhan baris mengikut" status: "Status" @@ -1144,7 +1144,7 @@ ms: notice_successful_delete: "Pemadaman yang berjaya." notice_successful_update: "Kemas kini yang berjaya." notice_job_started: "kerja bermula." - notice_bad_request: "Bad Request." + notice_bad_request: "Permintaan yang salah." relations: empty: Tiada perhubungan wujud remove: Padam perhubungan @@ -1156,7 +1156,7 @@ ms: button_cancel_all: "Batal" link_formatting_help: "Bantuan format teks" btn_preview_enable: "Tinjauan" - btn_preview_disable: "Disable preview" + btn_preview_disable: "Nyahdayakan tinjauan" null_value_label: "Tiada nilai" clear_value_label: "-" errors: @@ -1278,18 +1278,18 @@ ms: include_subprojects: "Termasuk semua sub-projek" tooltip: include_all_selected: "Projek sudah dimasukkan sejak Termasuk semua sub-projek didayakan." - current_project: "This is the current project you are in." + current_project: "Ini adalah projek yang anda terlibat dalam sekarang." does_not_match_search: "Projek tidak sepadan dengan kriteria carian." no_results: "Tiada projek yang sepadan dengan kriteria carian anda." baseline: toggle_title: "Dasar" clear: "Kosongkan" apply: "Gunakan" - header_description: "Highlight changes made to this list since any point in the past." - enterprise_header_description: "Highlight changes made to this list since any point in the past with Enterprise edition." + header_description: "Serlahkan perubahan yang dibuat ke senarai ini pada bila-bila masa lalu." + enterprise_header_description: "Serlahkan perubahan yang dibuat ke senarai ini pada bila-bila masa lalu dengan edisi Enterprise." show_changes_since: "Tunjuk perubahan sejak" baseline_comparison: "Perbandingan asas" - help_description: "Reference time zone for the baseline." + help_description: "Zon masa rujukan untuk yang dasar." time_description: "Dalam masa tempatan anda: %{datetime}" time: "Masa" from: "Dari" @@ -1322,7 +1322,7 @@ ms: filter_chip: remove: "Keluarkan" drop_modal: - focus_grab: "This is a focus anchor for modals. Press shift+tab to go back to the modal trigger element." + focus_grab: "Ini adalah paksi fokus untuk modul. Tekan shift+tab untuk kembali ke elemen pencetus modul." Close: "Tutup" open_project_storage_modal: waiting_subtitle: diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index 143941d54f0e..bf3000be818d 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -35,16 +35,16 @@ ms: primary-button-color: "Butang utama" accent-color: "Aksen" header-bg-color: "Latar belakang pengepala" - header-item-bg-hover-color: "Header background on hover" + header-item-bg-hover-color: "Latar belakang pengepala apabila tetikus berlegar" header-item-font-color: "Fon pengepala" - header-item-font-hover-color: "Header font on hover" - header-border-bottom-color: "Header border" + header-item-font-hover-color: "Fon pengepala apabila tetikus berlegar" + header-border-bottom-color: "Sempadan pengepala" main-menu-bg-color: "Latar belakang menu utama" main-menu-bg-selected-background: "Menu utama apabila dipilih" - main-menu-bg-hover-background: "Main menu on hover" + main-menu-bg-hover-background: "Menu utama apabila tetikus berlegar" main-menu-font-color: "Fon menu utama" main-menu-selected-font-color: "Muka taip menu utama apabila dipilih" - main-menu-hover-font-color: "Main menu font on hover" + main-menu-hover-font-color: "Fon menu utama apabila tetikus berlegar" main-menu-border-color: "Sempadan menu utama" custom_colors: "Pilihan warna sendiri" customize: "Ubah suai pemasangan OpenProject dengan logo dan warna anda sendiri." @@ -81,7 +81,7 @@ ms: upgrade_info: "Sila naik taraf ke pelan berbayar untuk aktifkan dan mula menggunakannya dalam pasukan anda." journal_aggregation: explanation: - text: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent and will also affect %{webhook_link} delay." + text: "Tindakan individu pengguna (cth. mengemas kini pakej kerja dua kali) digabungkan ke dalam satu tindakan tunggal jika perbezaan umur mereka kurang daripada tempoh masa yang ditetapkan. Mereka akan dipaparkan sebagai satu tindakan di dalam aplikasi. Ini juga akan menangguhkan pemberitahuan dengan jumlah masa yang sama, mengurangkan bilangan emel yang dihantar dan juga akan memberi kesan kepada penagguhan %{webhook_link}." link: "webhook" announcements: show_until: Tunjuk sehingga @@ -94,7 +94,7 @@ ms: deleted_by_admin: "Fail '%{filename}' yang diasingkan telah dihapuskan oleh pentadbir." overridden_by_admin: "Pengasingan untuk fail '%{filename}' telah dibatalkan oleh %{user}. Fail tersebut kini boleh diakses." quarantined_attachments: - container: "Container" + container: "Pengandung" delete: "Hapuskan fail yang di kuarantin" title: "Lampiran yang diasingkan" error_cannot_act_self: "Tidak boleh laksanakan tindakan pada fail yang anda muat naik sendiri." @@ -119,20 +119,20 @@ ms:
Sila lawati dokumentasi kami untuk arahan lebih terperinci. attribute_texts: - name: Arbitrary name of the LDAP connection + name: Nama arbitrari sambungan LDAP host: Nama hos LDAP atau alamat IP login_map: Kunci atribut dalam LDAP yang digunakan untuk kenal pasti login pengguna yang unik. Biasanya, ini akan menjadi `uid` atau `samAccountName`. - generic_map: The attribute key in LDAP that is mapped to the OpenProject `%{attribute}` attribute - admin_map_html: "Optional: The attribute key in LDAP that if present marks the OpenProject user an admin. Leave empty when in doubt." + generic_map: Kunci atribut LDAP yang telah dipetakan ke atribut OpenProject `%{attribute}` + admin_map_html: "Pilihan: kunci atribut LDAP yangjika hadiryang menandakan pengguna OpenProject sebagai pentadbir. Biarkan kosong jika ragu-ragu." system_user_dn_html: | Masukkan DN sistem pengguna yang digunakan untuk akses baca sahaja.
Contoh: uid=openproject,ou=system,dc=example,dc=com system_user_password: Masukkan kata laluan ikatan bagi pengguna sistem base_dn: | - Enter the Base DN of the subtree in LDAP you want OpenProject to look for users and groups. - OpenProject will filter for provided usernames in this subtree only. - Example: ou=users,dc=example,dc=com + Masukkan pangkalan DN dari peranti LDAP yang anda mahukan di OpenProject untuk mencari pengguna dan kumpulan. + OpenProject akan menyaring nama pengguna yang disediakan di peranti ini sahaja. + Contoh: ou=pengguna,dc=contoh,dc=com filter_string: | Tambah penyaring RFC4515 pilihan untuk digunakan pada hasil yang dikembalikan bagi pengguna yang disaring dalam LDAP. Ini boleh digunakan untuk mengehadkan set pengguna yang dijumpai oleh OpenProject untuk pengesahan dan penyelarasan kumpulan. @@ -522,7 +522,7 @@ ms: error_self_registration_disabled: > Pendaftaran pengguna tidak diaktifkan pada sistem ini. Sila minta pentadbir untuk mencipta satu akaun untuk anda. error_self_registration_limited_provider: > - User registration is limited for the Single sign-on provider '%{name}'. Please ask an administrator to activate the account for you or change the self registration limit for this provider. + Pendaftaran pengguna terhad pada penyediaan log masuk satu kali '%{name}'. Sila bertanya kepada pentadbir untuk mengaktifkan akaun tersebut untuk anda atau tukar had pendaftaran sendiri untuk penyediaan ini. login_with_auth_provider: "atau daftar masuk dengan akaun sedia ada anda" signup_with_auth_provider: "atau daftar menggunakan" auth_source_login: Sila log masuk sebagai %{login} untuk mengaktifkan akaun anda. @@ -552,7 +552,7 @@ ms: host: "Hos" onthefly: "Penciptaan pengguna automatik" port: "Port" - tls_certificate_string: "LDAP server SSL certificate" + tls_certificate_string: "Sijil SSL server LDAP" changeset: repository: "Repositori" color: @@ -862,7 +862,7 @@ ms: id_filter_required: "Saringan 'id' diperlukan." project: archived_ancestor: "Projek mempunyai leluhur yang diarkibkan." - foreign_wps_reference_version: "Work packages in non descendant projects reference versions of the project or its descendants." + foreign_wps_reference_version: "Pakej kerja dalam projek bukan keturunan versi rujukan projek atau keturunannya." attributes: base: archive_permission_missing_on_subprojects: "Anda tidak mempunyai kebenaran yang diperlukan untuk mengarkib semua sub-projek. Sila hubungi pentadbir." @@ -894,7 +894,7 @@ ms: name_not_included: "Lajur 'Nama' perlu disertakan" nonexistent: "Lajur '%{column}' tidak wujud." format: "%{message}" - group_by_hierarchies_exclusive: "is mutually exclusive with group by '%{group_by}'. You cannot activate both." + group_by_hierarchies_exclusive: "saling eksklusif dengan kumpulan '%{group_by}'. Anda tidak boleh mengaktifkan kedua-duanya." filters: custom_fields: inexistent: "Tiada medan tersuai untuk penapis tersebut." @@ -909,10 +909,10 @@ ms: attributes: to: error_not_found: "pakej kerja dalam posisi `ke` tidak dapat dijumpai atau tidak kelihatan." - error_readonly: "an existing relation's `to` link is immutable" + error_readonly: "pautan `ke` yang sedia ada tidak berubah" from: error_not_found: "pakej kerja dalam posisi `dari` tidak dapat dijumpai atau tidak kelihatan" - error_readonly: "an existing relation's `from` link is immutable" + error_readonly: "pautan `dari` yang sedia ada tidak berubah" repository: not_available: "Vendor SCM tidak tersedia" not_whitelisted: "adalah tidak dibenarkan oleh konfigurasi." @@ -1000,7 +1000,7 @@ ms: attribute_unknown: "Atribut pakej kerja tidak sah digunakan." attribute_unknown_name: "Atribut pakej kerja tidak sah digunakan: %{attribute}" duplicate_group: "Nama kumpulan '%{group}' digunakan lebih dari sekali. Nama kumpulan mesti unik." - query_invalid: "The embedded query '%{group}' is invalid: %{details}" + query_invalid: "Pencarian yang ditekankan '%{group}' tidak sah: %{details}" group_without_name: "Kumpulan tanpa nama tidak dibenarkan." user: attributes: @@ -1195,7 +1195,7 @@ ms: reset_token: action_create: Cipta action_reset: Set semula - heading_reset: "Set semula token sokongan" + heading_reset: "Tetapkan semula token sokongan" heading_create: "Cipta token sokongan" implications: > Membolehkan sandaran akan membenarkan mana-mana pengguna dengan kebenaran yang diperlukan dan token sandaran ini untuk memuat turun sandaran yang mengandungi semua data pemasangan OpenProject ini. Ini termasuk data semua pengguna. @@ -1203,7 +1203,7 @@ ms: Anda perlu menghasilkan token sandaran untuk dapat mencipta sandaran. Setiap kali anda ingin meminta sandaran anda perlu menyediakan token ini. Anda boleh memadam token sandaran tersebut untuk menyahdayakan sandaran untuk pengguna ini. verification: > Masukkan %{word} untuk mengesahkan anda mahu %{action} token sandaran. - verification_word_reset: set semula + verification_word_reset: Tetapkan semula verification_word_create: cipta warning: > Apabila anda mencipta token baharu anda hanya akan dibenarkan untuk meminta sokongan selepas 24 jam. Ini adalah langkah keselamatan. Selepas itu anda boleh meminta sokongan bila-bila masa menggunakan token tersebut. @@ -1211,7 +1211,7 @@ ms: error: invalid_token: Tidak sah atau token sandaran hilang token_cooldown: Token sandaran ini akan sah dalam %{hours} jam. - backup_pending: There is already a backup pending. + backup_pending: Sudah ada sokongan yang belum selesai. limit_reached: Anda hanya boleh membuat %{limit} sandaran setiap hari. button_actions: "Tindakan" button_add: "Tambah" @@ -1619,11 +1619,11 @@ ms: file_links_journal: > Mulai sekarang, aktiviti berkaitan dengan pautan fail (fail-fail yang disimpan di penyimpanan luaran) akan muncul dalam tab aktiviti. Yang berikut mewakili aktiviti berkenaan pautan yang sudah sedia ada: progress_calculation_adjusted_from_disabled_mode: >- - Progress calculation automatically set to work-based mode and adjusted with version update. + Perkembangan pengiraan ditetapkan ke mod berasaskan kerja secara automatik dan diselaraskan dengan versi kemas kini. progress_calculation_adjusted: >- - Progress calculation automatically adjusted with version update. + Perkembangan pengiraan diselaraskan dengan versi kemas kini. totals_removed_from_childless_work_packages: >- - Work and progress totals automatically removed for non-parent work packages with version update. This is a maintenance task and can be safely ignored. + Jumlah kerja dan perkembangan dipadam untuk pakej kerja bukan induk secara automatik dengan versi kemas kini. Ini ialah tugasan penyelenggaraan dan boleh diabaikan dengan selamat. links: configuration_guide: "Panduan konfigurasi" get_in_touch: "Anda mempunyai soalan? Sila hubungi kami." @@ -1766,13 +1766,13 @@ ms: label_forums_locked: "Terkunci" label_forum_new: "Forum baharu" label_forum_plural: "Forum-forum" - label_forum_sticky: "Sticky" + label_forum_sticky: "Pelekat" label_boolean: "Boolean" label_board_plural: "Board" label_branch: "Cabang" label_browse: "Melayari" label_bulk_edit_selected_work_packages: "Sunting secara pukal pakej kerja dipilih" - label_bundled: "(Bundled)" + label_bundled: "(Terkumpul)" label_calendar: "Kalendar" label_calendars_and_dates: "Kalendar dan tarikh" label_calendar_show: "Tunjuk Kalendar" @@ -1846,11 +1846,11 @@ ms: label_missing_or_hidden_custom_option: "(nilai yang hilang atau kurang kebenaran untuk mengakses)" label_descending: "Menurun" label_details: "Butiran" - label_development_roadmap: "Development roadmap" + label_development_roadmap: "Jadual pembangunan" label_diff: "beza" - label_diff_inline: "inline" + label_diff_inline: "sebaris" label_diff_side_by_side: "bersebelahan" - label_digital_accessibility: "Digital accessibility (DE)" + label_digital_accessibility: "Kebolehcapaian digital (DE)" label_disabled: "dinyahaktifkan" label_disabled_uppercase: "Dinyahaktifkan" label_display: "Paparan" @@ -1864,10 +1864,10 @@ ms: label_duplicates: "duplikasi" label_edit: "Edit" label_edit_x: "Sunting: %{x}" - label_enable_multi_select: "Toggle multiselect" + label_enable_multi_select: "Tukar pelbagai pilihan" label_enabled_project_custom_fields: "Medan tersuai yang diaktifkan" label_enabled_project_modules: "Modul yang diaktifkan" - label_enabled_project_activities: "Enabled time tracking activities" + label_enabled_project_activities: "Dayakan aktiviti penjejakan masa " label_end_to_end: "hujung ke hujung" label_end_to_start: "hujung ke mula" label_enumeration_new: "NIlai pengiraan baharu" @@ -1903,7 +1903,7 @@ ms: label_filter: "Penapis" label_filter_plural: "Saringan" label_filters_toggle: "Tunjuk/sembunyi penapis\n" - label_float: "Float" + label_float: "Terapung" label_folder: "Folder" label_follows: "ikut" label_force_user_language_to_default: "Tetapkan bahasa pengguna yang mempunyai bahasa yang tidak dibenarkan kepada default" @@ -1950,7 +1950,7 @@ ms: label_journal_diff: "Perbandingan Penerangan" label_language: "Bahasa" label_languages: "Bahasa-bahasa" - label_jump_to_a_project: "Jump to a project..." + label_jump_to_a_project: "Lompat ke projek..." label_keyword_plural: "Kata kunci" label_language_based: "Berdasarkan bahasa pengguna" label_last_activity: "Aktiviti terakhir" @@ -2313,11 +2313,11 @@ ms: macro_execution_error: "Ralat melaksanakan makro berikut %{macro_name}" macro_unavailable: "Makro %{macro_name} tidak dapat dipaparkan." macros: - placeholder: "[Placeholder] Macro %{macro_name}" + placeholder: "[Sementara] Makro %{macro_name}" errors: missing_or_invalid_parameter: "Parameter makro hilang atau tidak sah." legacy_warning: - timeline: "This legacy timeline macro has been removed and is no longer available. You can replace the functionality with an embedded table macro." + timeline: "Garis masa warisan makro ini telah dipadamkan and tidak lagi tersedia. Anda boleh menggantikan fungsi tersebut dengan makro jadual tertutup." include_wiki_page: removed: "Makro tersebut tidak lagi wujud." wiki_child_pages: @@ -2325,7 +2325,7 @@ ms: page_not_found: "Tidak dapat mencari halaman wiki '%{name}'." create_work_package_link: errors: - no_project_context: "Calling create_work_package_link macro from outside project context." + no_project_context: "Memanggil makro create_work_package_link dari luar konteks projek. " invalid_type: "Tiada jenis ditemui dengan nama '%{type}' dalam projek '%{project}'." link_name: "Pakej kerja baharu" link_name_type: "%{type_name} baharu" @@ -2404,7 +2404,7 @@ ms: summary: "Terdapat masalah dengan integrasi penyimpanan %{storage_name} anda " troubleshooting: text: "Untuk maklumat lebih lanjut, periksa penyimpanan fail" - link_text: "troubleshooting documentation" + link_text: "pencarisilapan dokumentasi" mail_body_account_activation_request: "Pengguna baharu (%{value}) telah mendaftar. Akaun ini menunggu kelulusan anda:" mail_body_account_information: "Maklumat akaun anda" mail_body_account_information_external: "Anda boleh menggunakan akaun %{value} anda untuk log masuk." @@ -2461,7 +2461,7 @@ ms: body: updated_by: without_message: "%{user} telah mengemas kini peranan yang anda miliki secara global." - with_message: "%{user} updated the roles you have globally writing:" + with_message: "%{user} telah mengemas kini peranan yang anda telah tulis secara global:" roles: "Anda kini mempunyai peranan yang berikut:" mail_user_activation_limit_reached: subject: Had pengaktifan pengguna dicapai @@ -2476,7 +2476,7 @@ ms: noscript_description: "Anda perlu mengaktifkan JavaScript untuk menggunakan OpenProject!" noscript_heading: "JavaScript dinyahdayakan" noscript_learn_more: "Ketahui lebih lanjut" - notice_accessibility_mode: The accessibility mode can be enabled in your [account settings](url). + notice_accessibility_mode: Mod kebolehcapaian boleh didayakan dalam [tetapan akaun](url) anda. notice_account_activated: "Akaun anda telah diaktifkan. Anda kini boleh log masuk." notice_account_already_activated: Akaun tersebut sudah diaktifkan. notice_account_invalid_token: Token pengaktifan tidak sah @@ -2504,19 +2504,19 @@ ms: notice_email_sent: "E-mel telah dihantar ke %{value}" notice_failed_to_save_work_packages: "Gagal untuk simpan %{count} pakej kerja pada %{total} yang dipilih: %{ids}." notice_failed_to_save_members: "Gagal untuk simpan ahli: %{errors}." - notice_deletion_scheduled: "The deletion has been scheduled and is performed asynchronously." + notice_deletion_scheduled: "Pemadaman telah dijadualkan dan dijalankan secara beransur-ransur." notice_file_not_found: "Halaman yang anda cuba untuk akses tidak wujud atau telah dikeluarkan." notice_forced_logout: "Anda telah dilog keluar secara automatik selepas %{ttl_time} minit tidak aktif." notice_internal_server_error: "Ralat berlaku pada halaman yang anda sedang cuba untuk akses. Jika anda berterusan mengalami masalah sila hubungi pentadbir %{app_title} anda untuk bantuan." notice_locking_conflict: "Maklumat telah dikemas kini oleh sekurang-kurangnya salah satu pengguna lain sementara itu." notice_locking_conflict_additional_information: "Kemas kini datang daripada %{users}." - notice_locking_conflict_reload_page: "Please reload the page, review the changes and reapply your updates." + notice_locking_conflict_reload_page: "Sila muat semula halaman, semak semula perubahan dan terapkan semula kemas kini anda." notice_member_added: Tambah %{name} ke projek. notice_members_added: Tambah %{number} pengguna ke projek. notice_member_removed: "Keluarkan %{user} dari projek." notice_member_deleted: "%{user} telah dikeluarkan dari projek ini dan dipadam." notice_no_principals_found: "Tiada hasil ditemui." - notice_bad_request: "Bad Request." + notice_bad_request: "Permintaan yang salah." notice_not_authorized: "Anda tidak diberi kebenaran untuk mengakses halaman ini." notice_not_authorized_archived_project: "Projek yang anda cuba untuk akses telah diarkibkan." notice_password_confirmation_failed: "Kata laluan tidak betul. Tidak boleh teruskan." @@ -2755,15 +2755,15 @@ ms: exception_title: "Tidak boleh mengakses repositori tersebut: %{message}" disabled_or_unknown_type: "Jenis yang dipilih %{type} dinyahaktifkan atau tidak lagi tersedia untuk vendor SCM %{vendor}." disabled_or_unknown_vendor: "Vendor SCM %{vendor} dinyahaktifkan atau tidak lagi tersedia." - remote_call_failed: "Calling the managed remote failed with message '%{message}' (Code: %{code})" + remote_call_failed: "Panggilan ke alat kawalan jauh yang dikendalikan gagal dengan mesej '%{message}' (Kod: %{code})" remote_invalid_response: "Menerima tindak balas yang tidak sah dari remote yang diuruskan." remote_save_failed: "Tidak dapat menyimpan repositori dengan parameter yang diambil dari remote tersebut." git: instructions: managed_url: "Ini adalah URL repositori Git terurus (lokal)." path: >- - Specify the path to your local Git repository ( e.g., %{example_path} ). You can also use remote repositories which are cloned to a local copy by using a value starting with http(s):// or file://. - path_encoding: "Override Git path encoding (Default: UTF-8)" + Tentukan laluan ke repositori Git tempatan anda (cth., %{example_path} ). Anda juga boleh menggunakan repositori jauh yang diklon ke salinan tempatan menggunakan nilai permulaan dengan http(s):// atau file://. + path_encoding: "Mengatasi pengekodan laluan Git (Default: UTF-8)" local_title: "Pautkan repositori Git lokal sedia ada" local_url: "URL lokal" local_introduction: "JIka anda mempunyai repositori Git sedia ada, anda boleh pautkan ia dengan OpenProject untuk mengaksesnya dari dalam aplikasi." @@ -2778,18 +2778,18 @@ ms: managed_url: "URL yang diuruskan" settings: automatic_managed_repos_disabled: "Nyahdayakan penciptaan automatik" - automatic_managed_repos: "Automatic creation of managed repositories" - automatic_managed_repos_text: "By setting a vendor here, newly created projects will automatically receive a managed repository of this vendor." - scm_vendor: "Source control management system" + automatic_managed_repos: "Penciptaan automatik repositori yang diurus" + automatic_managed_repos_text: "Dengan menetapkan vendor di sini, projek yang baru dicipta akan secara automatik menerima repositori yang dikendalikan vendor ini." + scm_vendor: "Sistem pengurusan kawalan sumber" scm_type: "Jenis repositori" scm_types: local: "Pautkan repositori lokal sedia ada" existing: "Pautkan repositori lokal" managed: "Cipta repositori baharu dalam OpenProject" storage: - not_available: "Disk storage consumption is not available for this repository." - update_timeout: "Keep the last required disk space information for a repository for N minutes.\nAs counting the required disk space of a repository may be costly, increase this value to reduce performance impact." - oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:" + not_available: "Penggunaan penyimpanan disk tidak tersedia untuk repositori." + update_timeout: "Simpan informasi ruang cakera terakhir yang diperlukan untuk repositori selama N minit.\nMemandangkan pengiraan ruang cakera yang diperlukan bagi repositori mungkin mahal, tinggikan nilai ini untuk mengurangkan kesan prestasinya." + oauth_application_details: "Nilai rahsia pelanggan tidak akan dapat untuk diakses lagi setelah anda menutup tetingkap ini. Sila salin nilai-nilai ini ke tetapan Integrasi Nextcloud OpenProject:" oauth_application_details_link_text: "Pergi ke halaman tetapan" setup_documentation_details: "JIka anda memerlukan bantuan mengkonfigurasikan penyimpanan fail baharu lihat dokumentasi berikut:" setup_documentation_details_link_text: "Setup penyimpanan fail" @@ -2822,7 +2822,7 @@ ms: Jika CORS telah dibenarkan, ini ialah asal yang dibenarkan untuk mengakses API OpenProject.
Sila semak dokumentasi di pengepala Asal untuk cara nyatakan nilai-nilai yang dijangkakan. setting_apiv3_write_readonly_attributes: "Tulis akses pada atribut baca sahaja" setting_apiv3_write_readonly_attributes_instructions_html: > - If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author.
Warning: This setting has a use-case for e.g., importing data, but allows administrators to impersonate the creation of items as other users. All creation requests are being logged however with the true author.
For more information on attributes and supported resources, please see the %{api_documentation_link}. + Jika dibenarkan, API tersebut akan membenarkan para pentadbir untuk menulis atribut baca sahaja statik semasa penciptaan, seperti createdAt dan pengarang.
Amaran: Tetapan ini mempunyai kes guna untuk e.g., mengimport data, tapi membenarkan para pentadbir untuk meniru penciptaan item sebagai pengguna lain. Walau bagaimanapun, semua permintaan penciptaan sedang dilog oleh pengarang sebenar.
Untuk maklumat lanjut tentang atribut dan sumber yang disokong, sila lihat %{api_documentation_link}. setting_apiv3_max_page_size: "Saiz halaman API maksimum" setting_apiv3_max_page_instructions_html: > Tetapkan saiz halaman maksimum yang boleh direspon API. Ia tidak mungkin boleh melaksanakan permintaan API yang kembalikan lebih banyak nilai pada satu halaman.
Amaran: Sila ubah nilai ini hanya jika anda pasti anda perlukannya. Tetapkan ia ke nilai tinggi akan memberi kesan kepada prestasi yang ketara, manakala nilai yang lagi rendah dari pilihan mengikut halaman akan mengakibatkan ralat di paparan yang dipautkan. @@ -2862,15 +2862,15 @@ ms: setting_commit_logtime_activity_id: "Aktiviti log masuk" setting_commit_logtime_enabled: "Benarkan pencatatan masa" setting_commit_ref_keywords: "Merujuk kata kunci" - setting_consent_time: "Masa pemberian keizinan" + setting_consent_time: "Masa pemberian persetujuan" setting_consent_info: "Teks maklumat kebenaran" setting_consent_required: "Persetujuan diperlukan" - setting_consent_decline_mail: "Consent contact mail address" - setting_cross_project_work_package_relations: "Allow cross-project work package relations" + setting_consent_decline_mail: "Alamat mel hubungan pemberi persetujuan" + setting_cross_project_work_package_relations: "Benarkan hubungan pakej kerja rentas projek" setting_first_week_of_year: "Minggu pertama dalam tahun mengandungi " setting_date_format: "Tarikh" setting_default_language: "Bahasa tetapan asas" - setting_default_projects_modules: "Default enabled modules for new projects" + setting_default_projects_modules: "Modul yang diaktifkan default untuk projek baru" setting_default_projects_public: "Projek baharu adalah awam secara asas" setting_diff_max_lines_displayed: "Jumlah maksimum baris perbezaan yang dipaparkan" setting_display_subprojects_work_packages: "Paparkan subprojek pakej kerja pada projek utama secara lalai" @@ -2879,32 +2879,32 @@ ms: setting_email_login: "Guna e-mel sebagai log masuk" setting_enabled_scm: "Aktifkan SCM" setting_enabled_projects_columns: "Lajur dalam senarai projek dipaparkan secara lalai" - setting_feeds_enabled: "Enable Feeds" + setting_feeds_enabled: "Aktifkan feed" setting_ical_enabled: "Bolehkan langganan iCalendar" setting_feeds_limit: "Had kandungan feed " - setting_file_max_size_displayed: "Max size of text files displayed inline" + setting_file_max_size_displayed: "Saiz maksimum fail teks ditampilkan sebaris " setting_host_name: "Nama hos" setting_invitation_expiration_days: "Pengaktifan e-mel tamat tempoh selepas" setting_work_package_done_ratio: "Pengiraan kemajuan" setting_work_package_done_ratio_field: "Berdasarkan kerja" setting_work_package_done_ratio_status: "Berdasarkan status" setting_work_package_done_ratio_explanation_html: > - In work-based mode, % Complete is calculated from how much work is done in relation to total work. In status-based mode, each status has a % Complete value associated with it. Changing status will change % Complete. + Di mod berasaskan kerja, % yang telah selesai dikira daripada berapa banyak kerja yang telah siap berhubungan dengan jumlah kerja. Di mod berasaskan status, setiap status mempunyai kadar % yang telah selesai berkait dengannya. Pertukaran status akan mengubah % yang telah selesai. setting_work_package_properties: "Ciri-ciri pakej kerja" setting_work_package_startdate_is_adddate: "Guna tarikh semasa sebagai tarikh mula untuk pakej kerja baharu" setting_work_packages_projects_export_limit: "Pakej kerja / had eksport projek" - setting_journal_aggregation_time_minutes: "User actions aggregated within" + setting_journal_aggregation_time_minutes: "Tindakan pengguna diagregatkan dalam" setting_log_requesting_user: "Log masuk pengguna yang direkodkan, nama, dan alamat mel untuk semua permintaan" setting_login_required: "Pengesahan diperlukan" setting_mail_from: "Alamat e-mel pengeluaran" setting_mail_handler_api_key: "Kekunci API" - setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" - setting_mail_handler_body_delimiter_regex: "Truncate emails matching this regex" + setting_mail_handler_body_delimiters: "Memangkas e-mel selepas salah satu barisan ini" + setting_mail_handler_body_delimiter_regex: "Memangkas e-mel yang hampir sama dengan regex ini" setting_mail_handler_ignore_filenames: "Lampiran mel yang diabaikan" setting_new_project_user_role_id: "Peranan yang diberikan kepada pengguna bukan pentadbir yang mencipta projek" setting_password_active_rules: "Kelas-kelas karakter yang aktif" - setting_password_count_former_banned: "Number of most recently used passwords banned for reuse" - setting_password_days_valid: "Number of days, after which to enforce a password change" + setting_password_count_former_banned: "Jumlah kebanyakkan kata laluan yang telah digunakan yang disekat untuk penggunaan semula" + setting_password_days_valid: "Jumlah hari selepas untuk menguatkuasakan pertukaran kata laluan" setting_password_min_length: "Panjang minimum" setting_password_min_adhered_rules: "Bilangan minimum kelas yang diperlukan" setting_per_page_options: "Pilihan objek setiap halaman" @@ -2912,7 +2912,7 @@ ms: setting_protocol: "Protokol" setting_project_gantt_query: "Paparan Gantt portfolio projek" setting_project_gantt_query_text: "Anda boleh mengubah suai pertanyaan yang digunakan untuk memaparkan carta Gantt dari halaman gambaran keseluruhan projek." - setting_security_badge_displayed: "Display security badge" + setting_security_badge_displayed: "Paparkan lambang sekuriti" setting_registration_footer: "Pengaki pendaftaran" setting_repositories_automatic_managed_vendor: "Jenis vendor repositori automatik" setting_repositories_encodings: "Pengekodan repositori" @@ -2923,7 +2923,7 @@ ms: setting_repository_checkout_text: "Teks arahan checkout" setting_repository_log_display_limit: "Bilangan maksimum semakan yang dipaparkan pada log fail" setting_repository_truncate_at: "Bilangan maksimum fail yang dipaparkan dalam pelayar repositori" - setting_rest_api_enabled: "Enable REST web service" + setting_rest_api_enabled: "Benarkan perkhidmatan web REST" setting_self_registration: "Pendaftaran sendiri" setting_session_ttl: "Masa tamat sesi selepas tidak aktif" setting_session_ttl_hint: "Nilai di bawah 5 berfungsi seperti dinyahaktifkan" @@ -2940,16 +2940,16 @@ ms: setting_welcome_text: "Teks blok selamat datang" setting_welcome_title: "Tajuk blok selamat datang" setting_welcome_on_homescreen: "Paparkan blok selamat datang pada skrin utama" - setting_work_package_list_default_highlighting_mode: "Default highlighting mode" - setting_work_package_list_default_highlighted_attributes: "Default inline highlighted attributes" + setting_work_package_list_default_highlighting_mode: "Mod perserlahan default" + setting_work_package_list_default_highlighted_attributes: "Atribut perserlahan sebaris default" setting_working_days: "Hari bekerja" settings: attachments: whitelist_text_html: > - Define a list of valid file extensions and/or mime types for uploaded files.
Enter file extensions (e.g., %{ext_example}) or mime types (e.g., %{mime_example}).
Leave empty to allow any file type to be uploaded. Multiple values allowed (one line for each value). + Jelaskan senarai sambungan fail yang sah dan/atau jenis mime bagi fail yang telah dimuat naik.
Masukkan sambungan fail (e.g., %{ext_example}) atau jenis mime (e.g., %{mime_example}).
Tinggalkan kosong untuk benarkan sebarang jenis fail untuk dimuat naik. Pelbagai nilai juga dibenarkan. (satu baris untuk setiap nilai) antivirus: title: "Pengimbasan virus" - clamav_ping_failed: "Failed to connect the the ClamAV daemon. Double-check the configuration and try again." + clamav_ping_failed: "Gagal untuk sambung ke daemon ClamAV. Semak semula konfigurasi tersebut dan cuba lagi." remaining_quarantined_files_html: > Pengimbasan virus telah dinyahaktifkan. %{file_count} kekal di dalam kuarantin. Untuk menyemak fail yang dikuarantin, sila lawati pautan ini: %{link} remaining_scan_complete_html: > @@ -2962,27 +2962,27 @@ ms: delete: "Padam fail tersebut" quarantine: "Kuarantin fail tersebut" instructions_html: > - Select the action to perform for files on which a virus has been detected:
  • %{quarantine_option}: Quarantine the file, preventing users from accessing it. Administrators can review and delete quarantined files in the administration.
  • %{delete_option}: Delete the file immediately.
+ Pilih tindakan untuk dilaksanakan ke fail yang didapati mempunyai virus:
  • %{quarantine_option}: Kuarantinkan fail tersebut untuk elakkan pengguna dari mengaksesnya. Para pentadbir boleh menyemak dan memadamkan fail yang dikuarantin di pentadbiran.
  • %{delete_option}: Padamkan fail dengan segera.
modes: - clamav_socket_html: Enter the socket to the clamd daemon, e.g., %{example} + clamav_socket_html: Masukkan soket ke daemon, e.g., %{example} clamav_host_html: Masukkan nama hos dan port ke clamd daemon dipisahkan dengan kolon. cth., %{example} description_html: > - Select the mode in which the antivirus scanner integration should operate.
  • %{disabled_option}: Uploaded files are not scanned for viruses.
  • %{socket_option}: You have set up ClamAV on the same server as OpenProject and the scan daemon clamd is running in the background
  • %{host_option}: You are streaming files to an external virus scanning host.
+ Pilih mod di mana integrasi pengimbas antivirus perlu dioperasikan.
  • %{disabled_option}: Fail yang telah dimuat naik belum diimbas untuk virus.
  • %{socket_option}: Anda telah tetapkan ClamAV di server sama seperti OpenProject dan imbasan daemon clamd sedang dilancarkan di latar belakang
  • %{host_option}: Anda sedang strim fail ke hos imbasan virus luar. brute_force_prevention: "Penyekatan pegguna secara automatik" date_format: first_date_of_week_and_year_set: > Jika pilihan "%{day_of_week_setting_name}" atau "%{first_week_setting_name}" telah ditetapkan, pilihan yang lain juga perlu ditetapkan untuk mengelakkan ketidakselarasan di bahagian muka depan. first_week_of_year_text_html: > - Select the date of January that is contained in the first week of the year. This value together with first day of the week determines the total number of weeks in a year. For more information, please see our documentation on this topic. + Pilih tarikh pada Januari yang mengandungi minggu pertama dari tahun tersebut. Nilai ini sekali dengan hari pertama dari minggu tersebut menentukan jumlah mingguan dalam setahun. Untuk maklumat lanjut, sila lihat dokumentasi kamibagi topik ini. experimental: - save_confirmation: Caution! Risk of data loss! Only activate experimental features if you do not mind breaking your OpenProject installation and losing all of its data. - warning_toast: Feature flags are settings that activate features that are still under development. They shall only be used for testing purposes. They shall never be activated on OpenProject installations holding important data. These features will very likely corrupt your data. Use them at your own risk. - feature_flags: Feature flags + save_confirmation: Awas! Risiko kehilangan data! Hanyalah aktifkan ciri eksperimen jika anda tidak keberatan melanggar pemasangan OpenProject anda dan kehilangan kesemua datanya. + warning_toast: Bendera ciri ialah tetapan yang mengaktifkan ciri-ciri yang masih dalam pembangunan. Ia hanyalah patut digunakan atas tujuan pemeriksaan. Ia tidak akan diaktifkan pada pemasangan OpenProject yang memegang data penting. Ciri-ciri ini kemungkinan besar akan merosakkan data anda. Gunakannya dengan risiko anda sendiri. + feature_flags: Fitur flags general: "Umum" highlighting: mode_long: - inline: "Highlight attribute(s) inline" - none: "No highlighting" + inline: "Serlahkan talian atribut" + none: "Tiada penyerlahan" status: "Keseluruhan baris mengikut Status" type: "Keseluruhan baris mengikut Jenis" priority: "Keseluruhan baris mengikut Keutamaan" @@ -2990,8 +2990,8 @@ ms: enable_subscriptions_text_html: "Benarkan pengguna dengan kebenaran yang diperlukan untuk melanggan kalendar OpenProject dan akses informasi pakej kerja melalui kalendar pelanggan luar.\nNota: Sila baca tentang langganan iCalendar untuk fahami tentang potensi risiko keselamatan sebelum membenarkannya." language_name_being_default: "%{language_name} (asas)" notifications: - events_explanation: "Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user." - delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." + events_explanation: "Tetapkan mana-mana peristiwa untuk e-mel dihantar keluar. Pakej kerja dikecualikan dari senarai ini kerana pemberitahuannya boleh dikonfigurasikan khusus ke setiap pengguna." + delay_minutes_explanation: "Penghantaran e-mel mungkin akan ditangguhkan untuk membenarkan pengguna dengan pemberitahuan dalam aplikasi yang dikonfigurasikan, untuk mengesahkan pemberitahuan dalam aplikasi sebelum e-mel dihantarkan. Pengguna yang membaca pemberitahuan dalam aplikasi tidak akan menerima e-mel, oleh kerana pemberitahuan tersebut telah pun dibaca." other: "Lain-lain" passwords: "Kata laluan" project_attributes: @@ -3065,7 +3065,7 @@ ms: text_custom_export_cover_instructions: > Ini merupakan imej yang akan muncul pada latar belakang muka hadapan PDF eksport anda. Perlu menjadi fail imej PNG atau JPEG berukuran kira-kira 800px lebar dan 500px tinggi. text_custom_favicon_instructions: > - This is the tiny icon that appears in your browser window/tab next to the page's title. It needs to be a squared 32 by 32 pixels sized PNG image file with a transparent background. + ini ialah ikon kecil yang akan dipaparkan di tetingkap laman layar/tab di sebelah tajuk halaman tersebut. Ia perlulah meggunakan fail imej PNG yang bersaiz 32 kali 32 piksel kuasa dua bersertaan latar belakang lutsinar. text_custom_touch_icon_instructions: > Ini merupakan ikon yang akan muncul dalam telefon bimbit atau tablet anda apabila anda meletakkan penanda pada skrin utama anda. Perlu menjadi fail imej PNG berukuran 180 x 180 piksel bersaiz persegi. Sila pastikan latar belakang imej tidak telus jika tidak ia akan kelihatan buruk pada iOS. text_database_allows_tsv: "Pangkalan data membenarkan TSVector (pilihan)" @@ -3074,24 +3074,24 @@ ms: text_destroy: "Hapus" text_destroy_with_associated: "Terdapat objek tambahan yang berkaitan dengan pakej kerja yang perlu dipadam. Objek tersebut adalah dari jenis berikut:" text_destroy_what_to_do: "Apakah yang anda ingin lakukan?" - text_diff_truncated: "... This diff was truncated because it exceeds the maximum size that can be displayed." - text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." + text_diff_truncated: "... Perbezaan ini dipendekkan kerana ia melebihi saiz maksimum yang boleh dipaparkan." + text_email_delivery_not_configured: "Penghantaran e-mel belum dikonfigurasi, dan pemberitahuan telah dinyahaktifkan.\nKonfigurasikan server SMTP anda untuk mengaktifkannya." text_enumeration_category_reassign_to: "Tetapkan semula mereka ke nilai ini:" text_enumeration_destroy_question: "%{count} objek ditugaskan pada nilai ini." text_file_repository_writable: "Lampiran direktori boleh ditulis" - text_git_repo_example: "a bare and local repository (e.g. /gitrepo, c:\\gitrepo)" + text_git_repo_example: "repositori kosong dan lokal (e.g. /gitrepo, c:\\gitrepo)" text_hint_date_format: "Masukkan tarikh dalam format TTTT-BB-HH. Format lain mungkin akan diubah ke tarikh yang tidak diingini." - text_hint_disable_with_0: "Note: Disable with 0" + text_hint_disable_with_0: "Nota: Nyahaktifkan dengan 0" text_hours_between: "Antara %{min} dan %{max} jam." text_work_package_added: "Pakej kerja %{id} telah dilaporkan oleh %{author}." - text_work_package_category_destroy_assignments: "Remove category assignments" + text_work_package_category_destroy_assignments: "Padam kategori tugasan" text_work_package_category_destroy_question: "Beberapa pakej kerja (%{count}) ditugaskan untuk kategori ini. Apakah yang anda ingin lakukan?" text_work_package_category_reassign_to: "Tetapkan semula pakej kerja ke kategori ini" text_work_package_updated: "Pakej kerja %{id} telah dikemas kini oleh %{author}." text_work_package_watcher_added: "Anda telah ditambah sebagai pemerhati untuk Pakej kerja %{id} oleh %{watcher_changer}." text_work_package_watcher_removed: "Anda telah dikeluarkan dari pemerhati Pakej kerja %{id} oleh %{watcher_changer}." text_work_packages_destroy_confirmation: "Adakah anda pasti anda ingin memadam pakej kerja yang dipilih tersebut?" - text_work_packages_ref_in_commit_messages: "Referencing and fixing work packages in commit messages" + text_work_packages_ref_in_commit_messages: "Merujuk dan membaiki pakej kerja dalam mesej kommit" text_journal_added: "%{label} %{value} ditambah" text_journal_attachment_added: "%{label} %{value} ditambah sebagai lampiran" text_journal_attachment_deleted: "%{label} %{old} dikeluarkan sebagai lampiran" @@ -3120,12 +3120,12 @@ ms: text_notice_security_badge_displayed_html: > Note: if enabled, this will display a badge with your installation status in the %{information_panel_label} administration panel, and on the home page. It is displayed to administrators only.
    The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit the configuration documentation. text_own_membership_delete_confirmation: "Anda akan mengeluarkan beberapa atau semua kebenaran anda dan mungkin tidak lagi dapat mengedit projek ini selepas itu.\nAdakah anda pasti anda ingin meneruskan?" - text_plugin_assets_writable: "Plugin assets directory writable" + text_plugin_assets_writable: "Direktori aset plugin boleh ditulis" text_powered_by: "Dikuasakan oleh %{link}" text_project_identifier_info: "Hanya huruf kecil (a-z), nombor, sengkang dan tanda garis bawah adalah dibernarkan, mesti mula dengan huruf kecil." text_reassign: "Tugaskan semula ke pakej kerja:" text_regexp_info: "cth. ^[A-Z0-9]+$" - text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+' + text_regexp_multiline: 'Regex digunakan dalam mod berbilang baris. cth., ^---\s+' text_repository_usernames_mapping: "Pilih atau kemas kini pengguna OpenProject yang dipetakan ke setiap nama pengguna yang dijumpai dalam log repositori.\nPengguna dengan OpenProject dan nama pengguna repositori atau e-mel yang sama dipetakan secara automatik. " text_status_changed_by_changeset: "Dilaksanakan dalam set perubahan %{value}." text_table_difference_description: "Dalam jadual ini, %{entries} yang tunggal ditunjukkan. Anda boleh lihat perbezaan antara mana-mana dua kemasukan dengan mula-mula memilih kotak semak dalam jadual. Apabila butang di bawah jadual ditekan, perbezaan akan ditunjukkan." @@ -3152,7 +3152,7 @@ ms: views: project: > %{plural} sentiasa dilampirkan kepada projek. Anda hanya boleh memilih projek disini dimana modul %{plural} tersebut adalah aktif. Selepas mencipta satu %{singular} anda boleh menambah pakej kerja dari projek lain kepadanya. - public: "Publish this view, allowing other users to access your view. Users with the 'Manage public views' permission can modify or remove public query. This does not affect the visibility of work package results in that view and depending on their permissions, users may see different results." + public: "Terbitkan paparan ini, membenarkan pengguna lain untuk akses paparan anda. Pengguna dengan kebenaran 'Urus paparan awam' boleh ubah suai atau keluarkan pertanyaan awam. Ini tidak akan mempengaruhi keterlihatan hasil pakej kerja dalam paparan itu dan bergantung kepada kebenaran mereka, pengguna mungkin melihat hasil yang berbeza." favoured: "Tandakan paparan ini sebagai kegemaran dan tambah ke bar sisi pandangan yang disimpan di sisi kiri." time: am: "pagi" @@ -3174,9 +3174,9 @@ ms: Hantar jemputan e-mel yang lain dengan token baharu jika yang lama sudah tamat tempohnya atau pengguna tidak menerima e-mel asal. Boleh juga digunakan untuk pengguna aktif untuk memilih kaedah pengesahan baharu. Apabila digunakan dengan pengguna aktif, status mereka akan berubah kepada 'dijemput'. tooltip: setting_email_login: > - If enabled a user will be unable to chose a login during registration. Instead their given email address will serve as the login. An administrator may still change the login separately. + Jika diaktifkan pengguna tidak akan dapat untuk memilih log masuk semasa pendaftaran. Sebaliknya e-mel yang mereka berikan akan digunakan sebagai log masuk. Pentadbir masih boleh mengubah log masuk berasingan. queries: - apply_filter: Apply preconfigured filter + apply_filter: Gunakan saringan pra-konfigurasi configure_view: heading: Konfigurasi paparan columns: @@ -3193,8 +3193,8 @@ ms: active: "aktif" activate: "Aktifkan" activate_and_reset_failed_logins: "Aktifkan dan set semula log masuk yang gagal" - authentication_provider: "Authentication Provider" - identity_url_text: "The internal unique identifier provided by the authentication provider." + authentication_provider: "Pemberi Pengesahan" + identity_url_text: "Pengenal unik dalaman diberikan oleh pemberi pengesahan." authentication_settings_disabled_due_to_external_authentication: > Pengguna ini mengesahkan melalui pembekal pengesahan luaran, jadi tiada kata laluan dalam OpenProject untuk diubah. authorization_rejected: "Anda tidak dibenarkan untuk daftar masuk." @@ -3338,7 +3338,7 @@ ms: lock_version: "Versi Terkunci " property: "Ciri" errors: - code_400: "Bad request: %{message}" + code_400: "Permintaan yang salah:%{message}" code_401: "Anda perlu disahkan untuk mengakses sumber ini." code_401_wrong_credentials: "Anda tidak memberikan kelayakan yang betul." code_403: "Anda tidak diberi kebenaran untuk mengakses sumber ini." @@ -3360,14 +3360,14 @@ ms: invalid_relation: "Hubungan tersebut adalah tidak sah." invalid_resource: "Untuk ciri '%{property}' sebuah pautan seperti '%{expected}' dijangkakan, tetapi mendapat '%{actual}'." invalid_signal: - embed: "The requested embedding of %{invalid} is not supported. Supported embeddings are %{supported}." + embed: "Permintaan menyemat %{invalid} tidak disokong. Penyematan yang disokong adalah %{supported}." select: "Permintaan %{invalid} yang dipilih tersebut tidak disokong. Pilihan yang disokong adalah %{supported}." invalid_user_status_transition: "Status akaun pengguna semasa tidak membenarkan operasi ini." missing_content_type: "tidak ditentukan" missing_property: "Sifat yang hilang '%{property}'." missing_request_body: "Tiada badan permintaan." - missing_or_malformed_parameter: "The query parameter '%{parameter}' is missing or malformed." - multipart_body_error: "The request body did not contain the expected multipart parts." + missing_or_malformed_parameter: "Parameter pertanyan '%{parameter}' tidak dijumpai atau cacat." + multipart_body_error: "Badan permintaan tidak mempunyai bahagian multipart seperti yang dijangka." multiple_errors: "Beberapa kekangan medan telah dilanggar." unable_to_create_attachment: "Lampiran tidak boleh dicipta" unable_to_create_attachment_permissions: "Lampiran tidak dapat disimpan kerana kurang kebenaran sistem fail" @@ -3389,7 +3389,7 @@ ms: ancestor: Tidak didedahkan - Leluhur tidak kelihatan kerana kurang kebenaran. doorkeeper: pre_authorization: - status: "Pre-authorization" + status: "Pra-kebenaran" auth_url: "URL Auth" access_token_url: "Akses token URL" errors: @@ -3407,8 +3407,8 @@ ms: server_error: "Server kebenaran mengalami keadaan yang tidak dijangka yang menghalangnya daripada memenuhi permintaan." temporarily_unavailable: "Server kebenaran pada masa ini tidak dapat mengendalikan permintaan kerana beban berlebihan sementara atau penyelenggaraan server." #Configuration error messages - credential_flow_not_configured: "Resource Owner Password Credentials flow failed due to Doorkeeper.configure.resource_owner_from_credentials being unconfigured." - resource_owner_authenticator_not_configured: "Resource Owner find failed due to Doorkeeper.configure.resource_owner_authenticator being unconfigured." + credential_flow_not_configured: "Aliran Kelayakan Kata Laluan Pemilik Sumber telah gagal disebabkan oleh Doorkeeper.configure.resource_owner_authenticator tidak dikonfigurasikan." + resource_owner_authenticator_not_configured: "Carian Pemilik Sumber gagal kerana Doorkeeper.configure.resource_owner_authenticator tidak dikonfigurasikan." admin_authenticator_not_configured: "Akses ke panel admin dilarang kerana Doorkeeper.configure.admin_authenticator tidak dikonfigurasi." #Access grant errors unsupported_response_type: "Server kebenaran tidak menyokong jenis respons ini." @@ -3440,10 +3440,10 @@ ms: instructions: name: "Nama aplikasi anda. Ini akan dipaparkan ke pengguna lain selepas kebenaran." redirect_uri_html: > - The allowed URLs authorized users can be redirected to. One entry per line.
    If you're registering a desktop application, use the following URL. - confidential: "Check if the application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are assumed non-confidential." - scopes: "Check the scopes you want the application to grant access to. If no scope is checked, api_v3 is assumed." - client_credential_user_id: "Optional user ID to impersonate when clients use this application. Leave empty to allow public access only" + URL yang dibenarkan untuk pengguna ubah hala. Satu kemasukan setiap baris.
    Jika anda mendaftar aplikasi desktop, guna URL berikut. + confidential: "Semak jika aplikasi akan digunakan dimana rahsia pelanggan boleh dikekalkan tersembunyi. Mobile apps asal dan Single Page Apps dianggap sebagai tidak sulit." + scopes: "Tandakan skop yang anda mahu aplikasi untuk berikan akses. Jika tiada skop ditandakan, api_v3 diandaikan." + client_credential_user_id: "ID pengguna pilihan untuk menyamar apabila pelanggan menggunakan aplikasi ini. Tinggalkan kosong untuk benarkan akses awam sahaja." register_intro: "Jika anda sedang membangunkan aplikasi pelanggan API OAuth untuk OpenProject, anda boleh mendaftarkannya menggunakan borang ini untuk semua pengguna menggunakan." default_scopes: "" client_id: "ID pelanggan" @@ -3471,7 +3471,7 @@ ms: client_credentials: "Aliran kelayakan pelanggan" client_credentials: "Pengguna yang digunakan untuk kelayakan pelanggan" client_credentials_impersonation_set_to: "Pengguna kelayakan pelanggan ditetapkan kepada" - client_credentials_impersonation_warning: "Note: Clients using the 'Client credentials' flow in this application will have the rights of this user" + client_credentials_impersonation_warning: "Nota: Pelanggan yang menggunakan aliran 'Kelayakan Pelanggan' dalam aplikasi ini akan mempunyai hak pengguna ini." client_credentials_impersonation_html: > Secara default, OpenProject menyediakan kebenaran OAuth 2.0 melalui %{authorization_code_flow_link}. Anda boleh memilih untuk mengaktifkan %{client_credentials_flow_link}, tetapi anda mesti menyediakan pengguna yang akan mewakili permintaan. authorization_error: "Sebuah ralat kebenaran telah berlaku." @@ -3486,7 +3486,7 @@ ms: label_oauth_integration: "Integrasi OAuth2" label_redirect_uri: "Ubah hala URI" label_request_token: "Permintaan token" - label_refresh_token: "Refresh token" + label_refresh_token: "Token muat semula" errors: oauth_authorization_code_grant_had_errors: "Pemberian pengesahan OAuth2 tidak berjaya" oauth_reported: "Pembekal OAuth2 dilapor" @@ -3496,16 +3496,16 @@ ms: oauth_returned_standard_error: "OAuth2 kembalikan sebuah ralat dalaman" wrong_token_type_returned: "Oauth2 mengembalikan jenis token yang salah, mengharapkan AksesToken::Pembawa" oauth_issue_contact_admin: "OAuth2 melaporkan sebuah ralat. Sila hubungi pentadbir sistem anda." - oauth_client_not_found: "OAuth2 client not found in 'callback' endpoint (redirect_uri)." + oauth_client_not_found: "Pelanggan OAuth2 tidak dijumpai dalam titik terakhir 'panggilan balik' (redirect_url)." refresh_token_called_without_existing_token: > - Internal error: Called refresh_token without a previously existing token. + Ralat dalaman: Memanggil refresh_token tanpa token yang sedia ada sebelum ini. refresh_token_updated_failed: "Ralat semasa kemas kini OAuthClientToken" oauth_client_not_found_explanation: > - This error appears after you have updated the client_id and client_secret in OpenProject, but haven't updated the 'Return URI' field in the OAuth2 provider. - oauth_code_not_present: "OAuth2 'code' not found in 'callback' endpoint (redirect_uri)." + Ralat muncul selepas anda mengemas kini client_id dan client_secret dalam Openproject, tetapi belum mengemas kini medan 'URI Kembali' dalam pembekal OAuth2. + oauth_code_not_present: "'Kod' OAuth2 tidak dijumpai dalam titik terakhir 'panggilan balik' (redirect_url)." oauth_code_not_present_explanation: > - This error appears if you have selected the wrong response_type in the OAuth2 provider. Response_type should be 'code' or similar. - oauth_state_not_present: "OAuth2 'state' not found in 'callback' endpoint (redirect_uri)." + Ralat ini muncul jika anda telah memilih response_type yang salah dalam pembekal OAuth2. Response_type perlu 'kod' atau serupa. + oauth_state_not_present: "'Kondisi' OAuth2 tidak dijumpai dalam titik terakhir 'panggilan balik' (ubah hala_url)." oauth_state_not_present_explanation: > 'Kondisi' digunakan untuk menunjukkan ke OpenProject tempat untuk meneruskan selepas kebenaran OAuth2 yang berjaya. Ketiadaan 'Kondisi' adalah ralat dalaman yang mungkin muncul semasa setup. Sila hubungi pentadbir sistem anda. rack_oauth2: diff --git a/modules/gitlab_integration/config/locales/crowdin/de.yml b/modules/gitlab_integration/config/locales/crowdin/de.yml index dcea6e577ab7..6b9d725a41c0 100644 --- a/modules/gitlab_integration/config/locales/crowdin/de.yml +++ b/modules/gitlab_integration/config/locales/crowdin/de.yml @@ -50,17 +50,17 @@ de: note_mr_commented_comment: > **Kommentiert in MR:** [%{gitlab_user}](%{gitlab_user_url}) kommentierte dieses WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) auf [%{repository}](%{repository_url}): %{mr_note} note_issue_referenced_comment: > - **Referenziert in Issue:** [%{gitlab_user}](%{gitlab_user_url}) verwies auf dieses WP in %{issue_number} [%{issue_title}](%{issue_url}) auf [%{repository}](%{repository_url}): %{issue_note} + **Referenziert in Ticket:** [%{gitlab_user}](%{gitlab_user_url}) verwies auf dieses WP in %{issue_number} [%{issue_title}](%{issue_url}) auf [%{repository}](%{repository_url}): %{issue_note} note_issue_commented_comment: > - **Kommentiert in Issue:** [%{gitlab_user}](%{gitlab_user_url}) kommentierte dieses WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) auf [%{repository}](%{repository_url}): %{issue_note} + **Kommentiert in Ticket:** [%{gitlab_user}](%{gitlab_user_url}) kommentierte dieses WP in Ticket %{issue_number} [%{issue_title}](%{issue_url}) auf [%{repository}](%{repository_url}): %{issue_note} note_snippet_referenced_comment: > **Referenziert in Snippet:** [%{gitlab_user}](%{gitlab_user_url}) verweist auf dieses WP in Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) auf [%{repository}](%{repository_url}): %{snippet_note} issue_opened_referenced_comment: > - **Issue eröffnet:** %{issue_number} [%{issue_title}](%{issue_url}) für [%{repository}](%{repository_url}) wurde von [%{gitlab_user}](%{gitlab_user_url}) eröffnet. + **Ticket erstellt:** %{issue_number} [%{issue_title}](%{issue_url}) für [%{repository}](%{repository_url}) wurde von [%{gitlab_user}](%{gitlab_user_url}) erstellt. issue_closed_referenced_comment: > - **Issue geschlossen:** %{issue_number} [%{issue_title}](%{issue_url}) für [%{repository}](%{repository_url}) wurde von [%{gitlab_user}](%{gitlab_user_url}) geschlossen. + **Ticket geschlossen:** %{issue_number} [%{issue_title}](%{issue_url}) für [%{repository}](%{repository_url}) wurde von [%{gitlab_user}](%{gitlab_user_url}) geschlossen. issue_reopened_referenced_comment: > - **Wiedereröffnetes Issue:** %{issue_number} [%{issue_title}](%{issue_url}) für [%{repository}](%{repository_url}) wurde von [%{gitlab_user}](%{gitlab_user_url}) wiedereröffnet. + **Wiedereröffnetes Ticket:** %{issue_number} [%{issue_title}](%{issue_url}) für [%{repository}](%{repository_url}) wurde von [%{gitlab_user}](%{gitlab_user_url}) wiedereröffnet. push_single_commit_comment: > **In MR gepusht:** [%{gitlab_user}](%{gitlab_user_url}) hat [%{commit_number}](%{commit_url}) auf [%{repository}](%{repository_url}) in %{commit_timestamp}gedrückt: %{commit_note} push_multiple_commits_comment: > diff --git a/modules/gitlab_integration/config/locales/crowdin/js-de.yml b/modules/gitlab_integration/config/locales/crowdin/js-de.yml index e6f009d89568..c4da9b7dd049 100644 --- a/modules/gitlab_integration/config/locales/crowdin/js-de.yml +++ b/modules/gitlab_integration/config/locales/crowdin/js-de.yml @@ -26,7 +26,7 @@ de: work_packages: tab_name: "GitLab" tab_header_issue: - title: "Probleme" + title: "Tickets" tab_header_mr: title: "Merge Requests" create_mr: @@ -36,7 +36,7 @@ de: label: Git-Schnipsel description: Git-Schnipsel in die Zwischenablage kopieren git_actions: - branch_name: Name des Branches + branch_name: Branch-Name commit_message: Commit-Nachricht cmd: Branch mit leerem Commit erstellen title: Schnelle Schnipsel für Git diff --git a/modules/gitlab_integration/config/locales/crowdin/ms.yml b/modules/gitlab_integration/config/locales/crowdin/ms.yml index 79ff3749cb0c..66c8c387a05a 100644 --- a/modules/gitlab_integration/config/locales/crowdin/ms.yml +++ b/modules/gitlab_integration/config/locales/crowdin/ms.yml @@ -62,6 +62,6 @@ ms: issue_reopened_referenced_comment: > **Isu Dibuka Semula:** Isu %{issue_number} [%{issue_title}](%{issue_url}) untuk [%{repository}](%{repository_url}) sudah dibuka semula oleh [%{gitlab_user}](%{gitlab_user_url}). push_single_commit_comment: > - **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note} + **Ditolak ke MR** [%{gitlab_user}] (%{gitlab_user_url}) ditolak [%{commit_number}] (%{commit_url}) ke [%{repository}] (%{repository_url}) di %{commit_timestamp}: %{commit_note} push_multiple_commits_comment: > - **Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed multiple commits [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note} + **Ditolak ke MR** [%{gitlab_user}] (%{gitlab_user_url}) beberapa komit telah ditolak [%{commit_number}] (%{commit_url}) ke [%{repository}] (%{repository_url}) pada %{commit_timestamp}: %{commit_note} diff --git a/modules/team_planner/config/locales/crowdin/js-ms.yml b/modules/team_planner/config/locales/crowdin/js-ms.yml index d3a968b63e1f..3348c0647093 100644 --- a/modules/team_planner/config/locales/crowdin/js-ms.yml +++ b/modules/team_planner/config/locales/crowdin/js-ms.yml @@ -6,18 +6,18 @@ ms: add_existing_title: 'Tambah pakej kerja sedia ada' create_label: 'Perancang pasukan' create_title: 'Cipta perancang pasukan baharu' - unsaved_title: 'Unnamed team planner' - no_data: 'Add assignees to set up your team planner.' - add_assignee: 'Add assignee' - remove_assignee: 'Remove assignee' + unsaved_title: 'Perancangan pasukan yang belum dinamakan' + no_data: 'Tambah penerima tugasan untuk tetapkan perancangan pasukan anda.' + add_assignee: 'Tambah penerima tugasan' + remove_assignee: 'Keluarkan penerima tugasan' two_weeks: '2-minggu' one_week: '1-minggu' four_weeks: '4-minggu' eight_weeks: '8-minggu' work_week: 'Minggu kerja' today: 'Hari ini' - drag_here_to_remove: 'Drag here to remove assignee and start and end dates.' - cannot_drag_here: 'Cannot remove the work package due to permissions or editing restrictions.' + drag_here_to_remove: 'Tarik ke sini untuk keluarkan penerima tugasan dan tarikh mula dan tamat. ' + cannot_drag_here: 'Tidak boleh memadam pakej kerja disebabkan batasan kebenaran atau pengeditan.' cannot_drag_to_non_working_day: 'Pakej kerja ini tidak boleh mula/habis pada hari tidak bekerja.' quick_add: empty_state: 'Guna medan carian untuk mencari pakej kerja dan tarik mereka ke perancang untuk menugaskannya ke seseorang dan tetapkan tarikh mula dan habis.' diff --git a/modules/two_factor_authentication/config/locales/crowdin/ms.yml b/modules/two_factor_authentication/config/locales/crowdin/ms.yml index deb0725a3eb8..7cfa37d712cb 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/ms.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/ms.yml @@ -168,7 +168,7 @@ ms: field_otp: "Kata laluan satu kali" notice_account_otp_invalid: " Kata laluan satu kali tidak sah." notice_account_otp_expired: "Kata laluan satu kali yang anda masukkan telah tamat tempoh." - notice_developer_strategy_otp: "Developer strategy generated the following one-time password: %{token} (Channel: %{channel})" + notice_developer_strategy_otp: "Strategi pembangunan telah generasikan kata laluan satu kali yang berikut: %{token} (Saluran: %{channel})" notice_account_otp_send_failed: "Kata laluan satu kali anda tidak dapat dihantar." notice_account_has_no_phone: "Tiada nombor telefon bimbit yang berkaitan dengan akaun anda." label_expiration_hint: "%{date} atau pada log keluar" From 74de1af1ec11db603b4e7b6c593994cfad5bbd84 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Wed, 8 May 2024 16:40:56 +0000 Subject: [PATCH 08/10] update locales from crowdin [ci skip] --- modules/gitlab_integration/config/locales/crowdin/js-de.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gitlab_integration/config/locales/crowdin/js-de.yml b/modules/gitlab_integration/config/locales/crowdin/js-de.yml index c4da9b7dd049..10f1a2e2bf5b 100644 --- a/modules/gitlab_integration/config/locales/crowdin/js-de.yml +++ b/modules/gitlab_integration/config/locales/crowdin/js-de.yml @@ -43,7 +43,7 @@ de: copy_success: '✅ Kopiert!' copy_error: '❌ Kopieren fehlgeschlagen!' tab_issue: - empty: 'Es sind noch keine Issues verlinkt. Verknüpfen Sie ein bestehendes Issue, indem Sie den Code OP#%{wp_id} (oder PP#%{wp_id} für private Links) im Titel/der Beschreibung verwenden.' + empty: 'Es sind noch keine Tickets verlinkt. Verknüpfen Sie ein bestehendes Ticket, indem Sie den Code OP#%{wp_id} (oder PP#%{wp_id} für private Links) im Titel/der Beschreibung verwenden.' tab_mrs: empty: 'Es sind noch keine Merge Requests verlinkt. Verknüpfen Sie einen bestehenden MR, indem Sie den Code OP#%{wp_id} (oder PP#%{wp_id} für private Links) im MR-Titel/der MR-Beschreibung verwenden, oder erstellen Sie einen neuen MR.' gitlab_pipelines: Pipelines From 67e78265516ed4b1da52a8949acd7f093db22eeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Wed, 8 May 2024 17:45:28 +0200 Subject: [PATCH 09/10] Fix files being left over in cache --- docker/prod/Dockerfile | 5 ----- docker/prod/setup/postinstall-common.sh | 13 ++++++++++++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index 5f97285464c4..4da988f6d536 100644 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -74,11 +74,6 @@ RUN cp Gemfile.lock.bak Gemfile.lock && rm Gemfile.lock.bak RUN ./docker/prod/setup/precompile-assets.sh RUN ./docker/prod/setup/postinstall-common.sh -# We need this so puma is allowed to create the tmp/pids folder and -# temporary upload files when running with a uid other than 1000 (app) -# but with an allowed supplemental group (1000). -RUN tmp_path=$APP_PATH/tmp; (mkdir -p $tmp_path || true) && chown $APP_USER:$APP_USER $tmp_path && chmod g+rw $tmp_path - RUN cp ./config/database.production.yml config/database.yml RUN ln -s $APP_PATH/docker/prod/setup/.irbrc /home/$APP_USER/ diff --git a/docker/prod/setup/postinstall-common.sh b/docker/prod/setup/postinstall-common.sh index 3da98edb802a..b5c81dca833e 100755 --- a/docker/prod/setup/postinstall-common.sh +++ b/docker/prod/setup/postinstall-common.sh @@ -5,4 +5,15 @@ set -eox pipefail mkdir -p /tmp/op_uploaded_files/ && chown -R $APP_USER:$APP_USER /tmp/op_uploaded_files/ # Remove any existing config/database.yml -rm -f ./config/database.yml \ No newline at end of file +rm -f ./config/database.yml + +# We need this so puma is allowed to create the tmp/pids folder and +# temporary upload files when running with a uid other than 1000 (app) +# but with an allowed supplemental group (1000). +tmp_path="$APP_PATH/tmp" +# Remove any previously cached files from e.g., asset building +rm -rf "$tmp_path" +# Recreate and own it for the user for later files (PID etc. see above) +mkdir -p "$tmp_path" +chown -R $APP_USER:$APP_USER "$tmp_path" +chmod g+rw "$tmp_path" From b8789b15f7edab66437c8b3ca5a8e4790b03b46b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Wed, 8 May 2024 17:50:59 +0200 Subject: [PATCH 10/10] Add some comment on why we added lib and vendor --- docker/prod/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index 4da988f6d536..58a30472ae7d 100644 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -52,8 +52,9 @@ RUN ./docker/prod/setup/preinstall-common.sh # stuff required for gems COPY Gemfile Gemfile.* .ruby-version ./ COPY modules ./modules +# Add vendor for saas-openproject plugins COPY vendor ./vendor -# some gemspec files of plugins require files in there, notably OpenProject::Version +# Add lib in case a plugin tries to load VERSION file under lib COPY lib ./lib RUN \